从代码配置 Windows Identity Foundation
我正在尝试“无配置 WIF”,我想接受由 Windows Azure 的 AppFabric STS 生成的 SAML2 令牌。
我正在做的是解析检查当前请求的令牌信息,如下所示:
if (Request.Form.Get(WSFederationConstants.Parameters.Result) != null)
{
SignInResponseMessage message =
WSFederationMessage.CreateFromFormPost(System.Web.HttpContext.Current.Request) as SignInResponseMessage;
var securityTokenHandlers = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection();
XmlTextReader xmlReader = new XmlTextReader(
new StringReader(message.Result));
SecurityToken token = securityTokenHandlers.ReadToken(xmlReader);
if (token != null)
{
ClaimsIdentityCollection claims = securityTokenHandlers.ValidateToken(token);
IPrincipal principal = new ClaimsPrincipal(claims);
}
}
上面的代码使用 SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection();用于验证和处理 SAML 令牌的集合。但是:这不起作用,因为显然应用程序尚未正确配置。如何在我的 securityTokenHandlers 集合上以编程方式从 XML 指定以下配置?
<microsoft.identityModel>
<service>
<audienceUris>
<add value="http://www.someapp.net/" />
</audienceUris>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true" issuer="https://rd-test.accesscontrol.appfabriclabs.com/v2/wsfederation" realm="http://www.thisapp.net" requireHttps="false" />
<cookieHandler requireSsl="false" />
</federatedAuthentication>
<applicationService>
<claimTypeRequired>
<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="true" />
<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" optional="true" />
</claimTypeRequired>
</applicationService>
<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<trustedIssuers>
<add thumbprint="XYZ123" name="https://somenamespace.accesscontrol.appfabriclabs.com/" />
</trustedIssuers>
</issuerNameRegistry>
</service>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我也在努力解决同样的问题,并在 WIF 3.5/4.0 中找到了一个可行的解决方案。由于 maartenba 的链接似乎已失效,我想在这里发布我的解决方案。
我们的要求是:
我用来得出解决方案的内容:
这里。
方法
在运行时注册 HTTP 模块,由 David Ebbo 解释。我
还尝试了更优雅的方法 由 Rick 解释
斯特拉尔,
但不幸的是,这对我来说并没有成功。
我的解决方案在 web.config 中不需要任何内容。大部分代码位于 global.asax.cs 中。此示例中的配置是硬编码的:
用法
我的应用程序是 asp.net WebForms,在经典管道模式下运行,支持表单身份验证以及 ADFS 登录。因此,身份验证是在所有 .aspx 页面共享的公共基类中处理的:
在此代码中,
ApplicationRootUrl
是以“/”结尾的应用程序路径(“/”在经典管道中很重要)模式)。由于混合模式下注销的稳定实现并不那么容易,因此我也想展示其代码。从技术上讲它是有效的,但我在注销 ADFS 帐户后立即再次登录 IE 仍然存在问题:(
ResetCookie
是一个帮助函数,可清除响应 cookie 并设置其过期时间)I was struggling with the same and found a working solution in WIF 3.5/4.0. Since maartenba's link seems to be dead, I wanted to post my solution here.
Our requirements were:
What I used to arrive at the solution:
here.
method
to register HTTP modules at runtime, explained by David Ebbo. I
also tried the more elegant method explained by Rick
Strahl,
but that unfortunately did not do the trick for me.
My solution needs nothing in web.config. The bulk of the code is in global.asax.cs. Configuration is hard-coded in this sample:
Usage
My app is asp.net WebForms, running in classic pipeline mode and supports forms authentication as well as ADFS login. Because of that, authentication is handled in a common base class shared by all .aspx pages:
In this code,
ApplicationRootUrl
is the application path ending in "/" (the "/" is important in Classic pipeline mode).As a stable implementation for logout in mixed mode was not so easy, I want to show the code for that as well. Technically it works, but I still have an issue with IE immediately logging in again after logging out an ADFS account:
(
ResetCookie
is a helper function that clears a response cookie and sets its expiration in the past)只是一个想法,不知道这是否有效:有没有办法获取实际的 XML(在您的情况下为空)并在运行时通过 Microsoft.IdentityModel.Configuration?
或者,您可以在发送登录请求时修改 XML 中的某些内容,位于 通过修改 SignInRequestMessage 实现 RedirectingToIdentityProvider 事件
Just a thought, no idea whether this works: Isn't there a way to get at the actual XML (which is empty in your case) and modify it at runtime through the classes in Microsoft.IdentityModel.Configuration?
Alternatively, some of the things in the XML you can modify at the time the sign-in request is sent out, in the RedirectingToIdentityProvider event by modifying the SignInRequestMessage
仅供参考:找到一个解决方案并在此处描述(和链接)的模块中实现它: http://blog.maartenballiauw.be/post/2011/02/14/Authenticate-Orchard-users-with-AppFabric-Access-Control-Service.aspx
FYI: found a solution and implemented it in a module described (and linked) here: http://blog.maartenballiauw.be/post/2011/02/14/Authenticate-Orchard-users-with-AppFabric-Access-Control-Service.aspx