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。
我正在尝试使用 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。