声明不会持久存在于会话令牌中

时间:2014-08-15 19:49:15

标签: caching session-cookies claims-based-identity claims

在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;

然后,我执行一些数据库访问,向convertedPrincipal添加新的声明。然后创建一个新的主体(可能不需要这个额外的实例化,但其他人似乎这样做),写出来:

 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,但我只有一组初始声明 - 而不是我的转换添加的声明。

退出后,我的其他声明仍然存在。这是使用带有Identity 2.0etc的新Visual Studio 2013基本MVC模板。

我认为正在发生的是登录首先运行:

    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

这将在我的声明被转换之前写入身份验证cookie。在此之后,我的claimtrnsformer运行并编写自己的授权cookie,所以现在我有两个。当我退出时,第一个人的索赔丢失了,而不是第二个人的索赔变得活跃。

很困惑。

由于 射线

1 个答案:

答案 0 :(得分:2)

看起来你正在混合这两种架构。

  • ClaimsAuthenticationManager和FederatedAuthentication.SessionAuthenticationModule是.NET 4.5的处理方式。也称为WIF方法。
  • SignInManager是OWIN。

当您使用OWIN时,确实不要以这种方式使用WIF。

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