【发布时间】:2014-08-16 16:06:49
【问题描述】:
在 Pluralsight 上看过 Dominick Baier 的视频,其中大部分是我从那里获得的。我正在尝试在 .net 4.5,MVC 中进行声明转换。经过大量的混乱,我可以改变索赔,但不能让他们坚持下去。如果我让它每次都运行我的 ClaimsTransformer 没问题,但这会访问数据库,所以我想缓存这些。
这就是我所做的
class ClaimsTransformer : ClaimsAuthenticationManager
{
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
ClaimsPrincipal transformedPrincipal = incomingPrincipal;
然后我执行一些数据库访问,将新声明添加到转换后的Principal。然后创建一个新的主体(可能不需要这个额外的实例化,但其他人似乎这样做),写出来:
ClaimsPrincipal newClaimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(transformedPrincipal.Claims, "ApplicationCookie"));
if (HttpContext.Current != null)
{
// this caches the transformed claims
var sessionToken = new SessionSecurityToken(newClaimsPrincipal, TimeSpan.FromHours(8));
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
}
return newClaimsPrincipal;
我可以在 newClaimsPrincipal 中看到新的声明。为了强制调用转换,我使用 ThinkTecture 人员的 ClaimsTransformationHttpModule 并且可以验证此代码是否运行:
context.User = transformedPrincipal;
HttpContext.Current.User = transformedPrincipal;
Thread.CurrentPrincipal = transformedPrincipal;
我的附加声明是transformPrincipal 的一部分。
看起来不错 - 但是当后续请求进来时,我没有额外的声明。 ClaimsTransformer 没有像预期的那样被调用,但我只有最初的一组声明 - 而不是我的转换添加的那些。
注销后,我的附加声明仍然存在。这是使用带有 Identity 2.0 等的新 Visual Studio 2013 基本 MVC 模板。
我认为正在发生的是登录首先运行:
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
这会在我的声明被转换之前写入身份验证 cookie。在此之后,我的 claimtransformer 运行并编写了自己的授权 cookie,所以现在我有两个。当我注销时,第一个索赔丢失,而不是第二个索赔激活。
我很困惑.com。
谢谢 雷
【问题讨论】:
标签: caching session-cookies claims-based-identity claims