AspnetCore 3.1 OpenIdConnectEvent 使用来自 ClaimActions.MapJsonKey 的声明

AspnetCore 3.1 OpenIdConnectEvent using claims from ClaimActions.MapJsonKey

我正在尝试使用 OnTokenValidated 事件向登录用户主体添加自定义声明。要获得这些声明,我需要从数据库中获取数据。

事件已调用,我可以访问数据库,一切都应该没问题:

options.Events.OnTokenValidated = requestContext=> {
var ctx = requestContext.HttpContext.RequestServices.GetRequiredService<IPersistenceContext>();
    var principal = requestContext.Principal;

    var userExternalId = principal.FindFirstValue(IdentityModel.JwtClaimTypes.Subject);
    var user = await ctx.Users
        .FirstOrDefaultAsync(u => u.ExternalId == userExternalId);
//do stuff with the user
}

除此之外,在 OnTokenValidated 中我需要访问使用 ClaimActions.MapJsonKey 映射的声明。例如,我需要访问用户的角色,映射如下: options.ClaimActions.MapJsonKey(JwtClaimTypes.Role, JwtClaimTypes.Role, JwtClaimTypes.Role);

现在,当我尝试检查 OnTokenValidated 中主体的声明时,没有角色声明。仅存在 'standard' 个 OIDC 声明。

登录完成后应用程序可以使用这些角色,因此它们的映射按预期工作。

如何在 OpenIdConnectEvent 中访问角色声明(以及通过 ClaimActions.MapJsonKey 映射的任何其他内容)?

为什么不进入 OpenIDConnect 事件,而是进入 Cookie 处理程序事件?例如,其中包含可能对您有用的 OnSigningIn

两个handler的关系如下图所示:

Cookie 处理程序将从 OpenIdConnect 获取最终的 ClaimsPrincpal 用户对象,并从中创建 cookie。