在dotnet核心中向UserPrincipal的请求添加声明

时间:2019-06-11 10:58:41

标签: asp.net-core .net-core

几年前,我已经做了类似的事情,但是找不到我的代码,也记不起我是怎么做到的!

我收到一个已通过身份验证的请求,但是令牌不包含我要求的特定声明。使用中间件,我想读取令牌中的用户ID(已经存在),并基于该用户ID从外部来源向UserPrincipal添加附加声明。请注意,我不想操纵令牌发送回去,它只是在api的上下文中。

我想这样做,以便我的控制器可以访问此声明而不必显式请求它,因此应该从头开始。

我相信我创建了一些添加索赔的中间件,但是我看不到任何与添加索赔有关的示例,在搜索时,它与更新发送回的实际令牌中的索赔更相关,这不是我想要的。

1 个答案:

答案 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>();
        //...
    }