使用 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
将修改 ClaimsPrincipal
和 ClaimsTransformation
之后会被调用来添加我自己的声明。
我有一个使用 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
将修改 ClaimsPrincipal
和 ClaimsTransformation
之后会被调用来添加我自己的声明。