在OpenId Connect提供程序进行身份验证后,如何使用自定义声明向ClaimPrincipal添加和保留新的ClaimsIdentity

时间:2017-04-10 12:25:44

标签: authentication cookies asp.net-core openid-connect

我使用OpenId Connect与.NetCore将用户发送到外部OpenId Connect身份验证提供程序(OP),该提供程序返回相关的访问令牌和经过身份验证的ClaimsPrinciple,其中包含来自OP的声明,如姓名,电子邮件地址,客户ID等我想要做的是,一旦用户通过身份验证并从OP返回ClaimsPrinciple,我想添加一个ClaimsIdentities,其中包含用户持有的每个许可证的自定义声明到ClaimsPrinciple。因此,当用户在其帐户许可之间切换时,我可以访问该许可的正确标识,并根据自定义声明提供对功能的访问。目前,我可以将自定义声明添加到ClaimsIdentity,然后将ClaimsIdentity添加到ClaimsPrinciple,但新身份不会保留并添加到Cookie中。

因此用户可以拥有多个许可证。 对于每个许可证,我想添加一个ClaimsIdentity。 然后我想通过使用cookie将更改保留到ClaimsPrinciple。

这是一个代码片段,希望能够添加一些上下文。这是针对我的应用程序中的Login方法,一旦OP验证了用户,就会触发该方法。

public async Task<IActionResult> Login()
{
     string token = HttpContext.Authentication.GetTokenAsync("access_token").Result;
     string refreshToken = HttpContext.Authentication.GetTokenAsync("refresh_token").Result;

     // ControllerBase User class this is the User I want to add the identites to, I think.
     string userGuid = User.Claims.Where(c => c.Type == "Guid").FirstOrDefault().Value;

      UserTokens userTokens = new UserTokens
      {
          LastUpdatedDate = DateTime.Now,
          UserGuid = userGuid,
          UserAccessToken = token,
          RefreshToken = refreshToken
      };

      await _busClient.PublishAsync<UpdateUserTokens>(new UpdateUserTokens(userTokens));

      // Domain Model User, a different User to the controllerBase User 
      // this is how a user is represented in my application but this has 
      // no control over authentication and claims
      User user = await _requestClient.RequestAsync<UserGuidRequest, User>(new UserGuidRequest(userGuid));
      var userLicences = await _requestClient.RequestAsync<UserLicenceRequest, List<UserLicence>>(new UserLicenceRequest(userGuid));

      var identityServerUserClaims = User.Claims.ToList();

      foreach(UserLicence userLicence in userLicences)
      {
          List<Claim> userLicenceIdentityClaims = new List<Claim>();
          foreach (Claim claim in identityServerUserClaims)
          {
              userLicenceIdentityClaims.Add(claim);
          }

          userLicenceIdentityClaims.Add(new Claim(userLicence.RoleType.ToString(), ""));

          var userLicenceIdentity = new ClaimsIdentity(userLicenceIdentityClaims, User.Identity.AuthenticationType);

          userLicenceIdentity.Label = userLicence.Id.ToString();

          User.AddIdentity(userLicenceIdentity);
      }

      //TODO: either need to sign out then back in or save new user claims to cookies somehow?

      return View("Index", user);
 }

如果有人能提供帮助,我们将不胜感激。如果您需要更多信息,请询问,我会尝试尽我所能,希望这是一个良好的开端。

0 个答案:

没有答案