【问题标题】:Updating claims using Federated Authentication in asp.net mvc在 asp.net mvc 中使用联合身份验证更新声明
【发布时间】:2015-08-28 17:59:08
【问题描述】:

我在我的 MVC 项目中使用 FederatedAuthentication 类。

要创建 cookie,我使用 FederatedAuthentication.SessionAuthenticationModule.CreateSessionCookie(...);,但如果用户想要更改他们的名字,我似乎无法找到更新它们的方法。

如何在不注销的情况下访问和更新声明?

【问题讨论】:

    标签: asp.net-mvc federated-identity


    【解决方案1】:

    这个过程相当简单

    1. 获取 ClaimsPrincipal 的当前声明列表
    2. 删除您要更新的声明
    3. 添加新声明
    4. 像往常一样进行身份验证,传递声明列表。

      var claims = FederatedAuthentication.SessionAuthenticationModule
                .ContextSessionSecurityToken.ClaimsPrincipal.Claims.ToList();
      var givenNameClaim = claims.Single(x => x.Type == "given_name");
      var familyNameClaim = claims.Single(x => x.Type == "family_name");
      var timeZoneClaim = claims.Single(x => x.Type == "time_zone_string");
      var newName = new Claim(givenNameClaim.Type.ToString(), model.FirstName, givenNameClaim.ValueType, givenNameClaim.Issuer);
      var familyName = new Claim(familyNameClaim.Type.ToString(), model.LastName, familyNameClaim.ValueType, familyNameClaim.Issuer);
      var timeZone = new Claim(timeZoneClaim.Type.ToString(), model.SelectedTimeZone, timeZoneClaim.ValueType, timeZoneClaim.Issuer);
      UpdateClaims(newName, familyName, timeZone);
      
          public void UpdateClaims(params Claim[] updatedClaims)
      {
          var currentClaims = FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken.ClaimsPrincipal.Claims.ToList();
          foreach (var claim in updatedClaims)
          {
              currentClaims.Remove(currentClaims.Single(x => x.Type == claim.Type));
              currentClaims.Add(claim);
          }
      
          var principal = new ClaimsPrincipal(new ClaimsIdentity[] { new ClaimsIdentity(currentClaims, "Auth0") });
          var session = FederatedAuthentication.SessionAuthenticationModule.CreateSessionSecurityToken(
              principal,
              null,
              DateTime.UtcNow,
              DateTime.MaxValue.ToUniversalTime(),
              true);
          FederatedAuthentication.SessionAuthenticationModule.AuthenticateSessionSecurityToken(session, true);
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2022-01-08
      • 1970-01-01
      • 2017-09-30
      • 2010-09-24
      相关资源
      最近更新 更多