几年前,我已经做了类似的事情,但是找不到我的代码,也记不起我是怎么做到的!
我收到一个已通过身份验证的请求,但是令牌不包含我要求的特定声明。使用中间件,我想读取令牌中的用户ID(已经存在),并基于该用户ID从外部来源向UserPrincipal
添加附加声明。请注意,我不想操纵令牌发送回去,它只是在api的上下文中。
我想这样做,以便我的控制器可以访问此声明而不必显式请求它,因此应该从头开始。
我相信我创建了一些添加索赔的中间件,但是我看不到任何与添加索赔有关的示例,在搜索时,它与更新发送回的实际令牌中的索赔更相关,这不是我想要的。
答案 0 :(得分:0)
要在身份验证后向用户添加声明,.NET Core 2.x的首选方法是使用具有单一方法TransformAsync(ClaimsPrincipal)
的{{3}}。
1。创建一个CustomClaimsTransformer
public class CustomClaimsTransformer : IClaimsTransformation
{
private readonly IHttpContextAccessor _httpContextAccessor;
public CustomClaimsTransformer(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var accesToken = _httpContextAccessor.HttpContext.Request.Headers["Authorization"];
// get user id from token
//...
//add claims here
((ClaimsIdentity)principal.Identity).AddClaim(new Claim("type-x","value-x"));
return Task.FromResult(principal);
}
}
2。在ConfigureServices中注册它:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddTransient<IClaimsTransformation, CustomClaimsTransformer>();
//...
}