我目前正在使用以下方式实施联合身份验证解决方案:用于发布令牌的被动 STS、托管 Silverlight 应用程序的网站和 Silverlight 应用程序的 WCF 服务。
到目前为止,我能够:
- 重定向到 STS
- 登录并重定向到网站
- 通过访问在网站上显示声明
HttpContext.Current.User.Identity as IClaimsIdentity;
在网站的 web.config 上,我添加了所需的两个 WIF 模块(在 IIS 7 下)
<modules runAllManagedModulesForAllRequests="true">
<add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/>
<add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/>
</modules>
我还配置了 web.config 的 Microsoft.IdentityModel 部分,以使用我自己的 ClaimsAuthenticationManager 和 ClaimsAthorizationManager 实现。
<service name="Rem.Ria.PatientModule.Web.WebService.PatientService">
<claimsAuthenticationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthenticationManager"/>
<claimsAuthorizationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthorizationManager"/>
</service>
我的 ClaimsAuthenticationMAnager 只是设置 Thread.CurrentPrincipal 是提供了一个有效的 Principal 。
class RemClaimsAuthenticationManager : ClaimsAuthenticationManager
{
public override IClaimsPrincipal Authenticate ( string resourceName, IClaimsPrincipal incomingPrincipal )
{
if ( incomingPrincipal.Identity.IsAuthenticated )
{
Thread.CurrentPrincipal = incomingPrincipal;
}
return incomingPrincipal;
}
}
}
问题是当我的 ClaimsAuthorizationManager 被调用时,context.Principal.Identity 不包含具有声明的有效身份,Thread.CurrentPrincipal 也不包含。
有任何想法吗?