ADFS 2.0、WIF (WS-Federation)、ASP.NET:web.config 中没有定义 http 模块或任何 IdentityFoundation 配置(如大多数 WIF SDK 示例所示),而是使用 WSFederationAuthenticationModule、ServiceConfiguration 手动通过程序代码完成和 SignInRequestMessage 类。我在代码中将 http 重定向到 ADFS,它似乎工作正常,返回声明并将用户重定向回我的网站,并在 http 请求中使用序列化声明。所以问题是如何使用 WIF 类、属性和方法解析这个请求并从中提取声明值?谢谢
问问题
681 次
1 回答
1
以防万一想分享我的经验,它可能会在将来对某人有所帮助。好吧,我终于找到的解决方案如下所示:
var message = SignInResponseMessage.CreateFromFormPost(Request) as SignInResponseMessage;
var rstr = new WSFederationSerializer().CreateResponse(message, new WSTrustSerializationContext(SecurityTokenHandlerCollectionManager.CreateDefaultSecurityTokenHandlerCollectionManager()));
var issuers = new ConfigurationBasedIssuerNameRegistry();
issuers.AddTrustedIssuer("630AF999EA69AF4917362D30C9EEA00C22D9A343", @"http://MyADFSServer/adfs/services/trust");
var tokenHandler = new Saml11SecurityTokenHandler {CertificateValidator = X509CertificateValidator.None};
var config = new SecurityTokenHandlerConfiguration{
CertificateValidator = X509CertificateValidator.None,
IssuerNameRegistry = issuers};
config.AudienceRestriction.AllowedAudienceUris.Add(new Uri("MyUri"));
tokenHandler.Configuration = config;
using(var reader=XmlReader.Create(new StringReader(rstr.RequestedSecurityToken.SecurityTokenXml.OuterXml)))
{
token = tokenHandler.ReadToken(reader);
}
ClaimsIdentityCollection claimsIdentity = tokenHandler.ValidateToken(token);
我发现很少有类似的代码使用 SecurityTokenServiceConfiguration (它包含令牌处理程序)而不是 Saml11SecurityTokenHandler 来读取和解析令牌,但是由于证书验证失败,它对我不起作用。设置SecurityTokenServiceConfiguration.CertificateValidator
为X509CertificateValidator.None
没有帮助,因为安全令牌处理程序类使用它们自己的处理程序配置并忽略 STS 配置值,至少如果您像我一样通过代码指定配置参数,但是如果配置是在 web.config 中定义的,它可以正常工作。
于 2011-12-21T23:46:36.327 回答