【问题标题】:Claims not persisting in Session Token会话令牌中不存在的声明
【发布时间】: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


    【解决方案1】:

    看起来您正在混合使用这两种架构。

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

    确实不要在使用OWIN的时候这样使用WIF的东西。

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

    【讨论】:

    • 嘿,谢谢。让我走上了正确的轨道,我发现我可以设置一些东西来运行 OWin 标志。设置 cookie 时必须这样做:OnResponseSignIn = ctx => { ctx.Identity = TransformClaims(ctx.Identity); }
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 2013-01-29
    • 2021-04-30
    • 2021-02-13
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多