Caching 声明未在会话令牌中持久化

Caching 声明未在会话令牌中持久化,caching,session-cookies,claims-based-identity,claims,Caching,Session Cookies,Claims Based Identity,Claims,我在Pluralsight上看过Dominick Baier的视频,大部分都是从那里得到的。我正在尝试在.NET4.5 MVC中进行声明转换。经过一番周折后,我可以改变这些主张,但不能让它们持续下去。如果每次都让它运行我的ClaimsTransformer没有问题,但这是在访问数据库,所以我想缓存这些 这就是我所做的 class ClaimsTransformer : ClaimsAuthenticationManager { public override ClaimsPrin

我在Pluralsight上看过Dominick Baier的视频,大部分都是从那里得到的。我正在尝试在.NET4.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;
然后我执行一些数据库访问,向transformedPrincipal添加新声明。然后创建一个新的主体(可能不需要这个额外的实例化,但其他人似乎也这样做了),写出以下内容:

 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;
我的额外索赔是转换委托人的一部分

所以看起来不错——但当后续请求进来时,我没有额外的索赔。ClaimsTransformer并没有像预期的那样被调用,但我只有一组初始的声明,而不是通过转换添加的声明

注销后,我的附加声明将保留。这是使用新的Visual Studio 2013基本MVC模板,其标识为2.0etc

我认为发生的情况是首先运行登录:

    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
这会在我的声明转换之前写入身份验证cookie。接下来,我的claimstransformer运行并编写自己的授权cookie,所以现在我有两个。当我注销时,第一个人的声明将丢失,而不是第二个人的声明变为活动

我很困惑

谢谢
Ray看起来像是在混合这两种体系结构

  • ClaimsAuthenticationManager和FederatedAuthentication.SessionAuthenticationModule是.NET 4.5的工作方式。也称为WIF方法
  • SignInManager正在运行
实际上,在使用OWIN时,不要以这种方式使用WIF


这将澄清/解决你一半的问题。现在,您仍然需要OWIN中的ClaimsTransform。一些过滤器应该这样做,然后将其保存在OWIN标识Cookie中(我自己还没有这样做)。

嘿,谢谢。让我在正确的轨道上,我发现我可以设置一些运行OWin标志的程序。设置cookie时必须这样做:OnResponseSignIn=ctx=>{ctx.Identity=TransformClaims(ctx.Identity);}