在 ASP.NET Core 中使用声明可以很方便地存储和传递用户的自定义信息。然而,当我们使用自定义声明并跨中间件或控制器发送请求时,有时候会发现自定义声明丢失的问题。
此时,可以通过在 Startup.cs 文件中使用 AddClaimsTransformation 方法来解决此问题。该方法指定了一个委托,它可以修改或添加自定义声明以确保在整个请求流程中都可用。
以下是使用 AddClaimsTransformation 方法的代码示例:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
// 省略配置代码
options.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
var claimsTransformation = context.HttpContext.RequestServices
.GetRequiredService();
// 修改或添加自定义声明
return claimsTransformation.TransformAsync(context.Principal);
}
};
});
// 注册自定义声明转换服务
services.AddTransient();
}
public class CustomClaimsTransformer : IClaimsTransformation
{
public Task TransformAsync(ClaimsPrincipal principal)
{
// 修改或添加自定义声明
((ClaimsIdentity)principal.Identity).AddClaim(new Claim("custom_claim", "custom_claim_value"));
return Task.FromResult(principal);
}
}
在上述示例中,我们定义了一个 CustomClaimsTransformer 类,实现了 IClaimsTransformation 接口。AddClaimsTransformation 方法将此服务注册为应用程序的全局声明转换器。
在 JwtBearerEvents 中,我们检索了已注册的 IClaimsTransformation 服务,并在 OnTokenValidated 事件中将传入的 ClaimsPrincipal 对象交给该服务进行自定义声明转换。TransformAsync 方法是在处理每个请求时自动调用的方法。它检查原始声明并可以修改或添加任何声明。
使用此方法,我们可以确保自定义声明可以在整个请求流程中保持传递和一致性,而不会丢失。