题
我目前正在实施联合身份验证解决方案,使用:发行代币的无源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部分,以使用我自己的Simplesauthentication Manager和SopealSathorizationManager的实现。
<service name="Rem.Ria.PatientModule.Web.WebService.PatientService">
<claimsAuthenticationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthenticationManager"/>
<claimsAuthorizationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthorizationManager"/>
</service>
我的索赔义务人才只是设置线程。CurrentPrincipal是提供有效的原理。
class RemClaimsAuthenticationManager : ClaimsAuthenticationManager
{
public override IClaimsPrincipal Authenticate ( string resourceName, IClaimsPrincipal incomingPrincipal )
{
if ( incomingPrincipal.Identity.IsAuthenticated )
{
Thread.CurrentPrincipal = incomingPrincipal;
}
return incomingPrincipal;
}
}
}
问题在于,当我称呼我的索赔授权manager时,context.principal.Identity不包含具有索赔的有效身份,而线程。
有任何想法吗?
解决方案
您无需设置螺纹。CurrentPrincipal,因为会话模块将为您执行此操作。您将需要通过httpcontext.current.user访问它,因为螺纹通常设置在与访问服务的线程上的不同线程上,因为它是IIS中的两个不同的模块。我们在即将出版的书中有一个例子,您可以在我们的 Codeplex网站.
Hth
其他提示
以下示例代码显示了继承索赔的示例类。它只是收到传入的ICLaimsprincipal,并通过索赔,除了已修改的名称索赔。如您的示例中,这并不能在当前线程上设置当前电气。
我的测试实现如下:
public class CustomClaimsAuthenticationManager : ClaimsAuthenticationManager
{
public CustomClaimsAuthenticationManager()
{
}
public override IClaimsPrincipal Authenticate(string resourceName,
IClaimsPrincipal incomingPrincipal)
{
var outgoingIdentity = GetClaimsAsPassthrough(incomingPrincipal);
return outgoingIdentity;
}
private IClaimsPrincipal GetClaimsAsPassthrough(IClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return incomingPrincipal;
}
var ingoingClaims = incomingPrincipal.Identity as IClaimsIdentity;
ClaimsIdentity outgoingIdentity = new ClaimsIdentity(new List<Claim>
{
new Claim(ClaimTypes.Name, (incomingPrincipal.Identity.Name + "
a very cool guy"))
}, incomingPrincipal.Identity.AuthenticationType);
foreach (var claim in ingoingClaims.Claims.Where(
c => c.ClaimType != ClaimTypes.Name))
{
outgoingIdentity.Claims.Add(claim.Copy());
}
return new ClaimsPrincipal(new List<ClaimsIdentity> { outgoingIdentity });
}
}
不隶属于 StackOverflow