我使用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);
}
如果有人能提供帮助,我们将不胜感激。如果您需要更多信息,请询问,我会尝试尽我所能,希望这是一个良好的开端。