使用 Jwt Bearer Authentication 的自定义声明

Custom claims with Jwt Bearer Authentication

我有一个使用 JwtBearerAuthentication 的应用程序。我试图在每个请求的开头将我的应用程序声明添加到 User(ClaimsPrincipal)。我设法使用 ClaimsTransformationOptions:

做到了这一点
app.UseClaimsTransformation(new ClaimsTransformationOptions
{
    Transformer = new ClaimsTransformer<TUser, TRole>()
});

在我的 TransformAsync:

public async Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
{
    var services = context.Context.RequestServices;
    var userManager = services.GetRequiredService<UserManager<TUser>>();
    var roleManager = services.GetRequiredService<RoleManager<TRole>>();

    var userId = 1; // Get the UserId from my store, let say its 1 for now

    if (userId != 0)
    {
        var user = await userManager.FindByIdAsync(userId);

        var claimsPrincipal = await new UserClaimsPrincipalFactory<TUser, TRole>(userManager, roleManager, _optionsAccessor)
                .CreateAsync(user);

        context.Principal.AddIdentities(claimsPrincipal.Identities);
    }

    return context.Principal;
}

到目前为止一切顺利,正在从数据库加载声明并添加到 context.Principal。我的问题是一旦我到达控制器,身份就会被覆盖!!

所以我通过将 app.UseClaimsTransformation 放在 app.UseJwtBearerAuthentication 之后解决了这个问题,确保每当 JWT 将修改 ClaimsPrincipalClaimsTransformation之后会被调用来添加我自己的声明。