1

ADFS 2.0、WIF (WS-Federation)、ASP.NET:web.config 中没有定义 http 模块或任何 IdentityFoundation 配置(如大多数 WIF SDK 示例所示),而是使用 WSFederationAuthenticationModule、ServiceConfiguration 手动通过程序代码完成和 SignInRequestMessage 类。我在代码中将 http 重定向到 ADFS,它似乎工作正常,返回声明并将用户重定向回我的网站,并在 http 请求中使用序列化声明。所以问题是如何使用 WIF 类、属性和方法解析这个请求并从中提取声明值?谢谢

4

1 回答 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.CertificateValidatorX509CertificateValidator.None没有帮助,因为安全令牌处理程序类使用它们自己的处理程序配置并忽略 STS 配置值,至少如果您像我一样通过代码指定配置参数,但是如果配置是在 web.config 中定义的,它可以正常工作。

于 2011-12-21T23:46:36.327 回答