【问题标题】:Two claims principal in one request in ASP.NET CoreASP.NET Core 中一个请求中的两个声明主体
【发布时间】:2023-02-07 11:21:18
【问题描述】:
我们可以访问 ClaimsPrincipal 以获取来自 HttpContext.User 的当前请求。在我看来,自定义处理程序中的 AuthenticateResult.Success() 将 HttpContext.User 设置为创建的 ClaimsPrincipal。这就是问题所在。
我使用 cookie 身份验证方案对用户进行身份验证,使用自定义身份验证方案对客户端进行身份验证。
在某些情况下,客户端将用户重定向到我的应用程序,然后我必须对重定向用户的客户端以及被重定向的用户进行身份验证。
因此,在客户端身份验证成功后,我创建身份验证票证并将ClaimsPrincipal 缓存在HttpContext.User 中。在下一步中,我对用户进行身份验证。而现在呢?当前现有客户端的 ClaimsPrincipal 被用户的 ClaimsPrincipal 覆盖,我丢失了有关经过身份验证的客户端的信息。
那么我怎样才能为HttpContext设置多个ClaimsPrinciapl呢?或者还有其他更好的解决方案吗?
【问题讨论】:
标签:
asp.net-core
authentication
claims
【解决方案1】:
您可以在登录时使用以下代码。
HttpContext.Authentication.SignInAsync("Cookie", userPrincipal1,
new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
IsPersistent = false,
AllowRefresh = false
});
当你想添加另一个 ClaimsPrincipal 时,你可以使用下面的代码。
var userPrincipal2= new ClaimsPrincipal(new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, "Jason"),
new Claim(ClaimTypes.Role, "User"),
}));
httpContext.User.AddIdentity(userPrincipal2.Identity);
具有多个身份的 ClaimsPrincipal 对象称为“复杂身份”。您可以使用 HasClaim 方法检查任何身份中是否存在声明。