【问题标题】:Add claims to a UserPrincipal's request in dotnet core在 dotnet core 中向 UserPrincipal 的请求添加声明
【发布时间】:2019-06-12 15:14:00
【问题描述】:

几年前我做过类似的事情,但找不到我的代码,也不记得我是怎么做到的!

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

我想这样做,以便我的控制器无需明确请求即可访问此声明,它应该一开始就存在。

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

【问题讨论】:

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


    【解决方案1】:

    要在身份验证后向用户添加声明,.NET Core 2.x 的首选方法是使用 IClaimsTransformation,它有一个方法 TransformAsync(ClaimsPrincipal)

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

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2021-12-26
      • 1970-01-01
      • 2023-02-07
      • 2019-01-28
      相关资源
      最近更新 更多