我正在使用IdentityServer4和OpenId来验证我的MVC应用中的用户,并希望添加我自己的声明。但我不确定哪个OpenIdConnectEvents我应该这样做。
这tutorial说我......
在身份验证流程中,您可能希望修改从IDP获得的声明。在ASP.NET Core 1.0中,您可以从OpenID Connect中间件在AuthenticationValidated事件中执行声明转换。
您在AuthenticationValidated期间添加的任何声明都存储在会话身份验证Cookie中。
但是,此事件在ASP.NET Core 1.1中不可用
我曾尝试在TokenValidated事件中执行此操作..
var principal = context.Request.HttpContext.User;
principal.Identities.First().AddClaim(new Claim("TenantId", user.TenantId.ToString()));
但是,当我在身份验证后列出用户声明时,它未列出。
@foreach (var claim in User.Claims)
{
<dt>@claim.Type</dt>
<dd>@claim.Value</dd>
}
答案 0 :(得分:9)
您使用TokenValidated
事件的方法似乎是正确的,但是您尝试添加声明的方式是错误的。
此时,在身份验证过程中,用户仍未通过身份验证。 OpenID Connect中间件仍在整合所需的所有信息。然后,它会将此信息传递给Cookie中间件,该中间件将使用会话cookie实现身份验证。
我的观点是,此时不要使用context.Request.HttpContext.User
,因为它不包含通过OIDC验证的用户。您可以使用context.Ticket.Principal.Identities.First().AddClaim
添加声明,因为这是稍后将传递给Cookie中间件的标识。