【问题标题】:How do I add custom user claims in JWT and user principal when using Microsoft.AspNetCore.ApiAuthorization.IdentityServer使用 Microsoft.AspNetCore.ApiAuthorization.IdentityServer 时如何在 JWT 和用户主体中添加自定义用户声明
【发布时间】:2019-11-08 16:27:44
【问题描述】:

我正在使用新的 React 模板,它是 .NET Core 3 版本的一部分。该模板使用Microsoft.AspNetCore.ApiAuthorization.IdentityServer 集成了 ASP.NET Core Identity、IdentityServer 和 React,用于用户注册、身份验证和授权。

这对于简单的场景非常有效,但我发现用于更复杂场景的文档令人困惑。这主要是因为现在有很多不同的齿轮,很难弄清楚在哪里看。

我想要做的是:我想向用户添加一个自定义声明(例如,IsAdmin: true)。此声明应在 ApiController 中的 .NET Core HttpContext 中可用(作为用户声明主体的一部分)用于身份验证,并且它应该是 React 可以读取此声明的地方(这可能是 identitytoken/jwt),以提供良好的用户体验。

什么是完成此任务的好方法?

【问题讨论】:

  • 您是否希望声明也出现在访问令牌中?
  • @AparnaGadgil 这可能是最好的。我认为这是在当前请求的用户主体中获取它的最简单方法,对吧?
  • 是的,正确!我在下面添加了我的答案以获得访问代码中的自定义声明。
  • 嗨尼克,只是想知道你是否设法解决了这个问题。我在尝试解决如何将自定义声明或角色声明添加到客户端时遇到完全相同的问题?
  • 有关更多背景信息,请查看答案here

标签: c# asp.net-core identityserver4 asp.net-core-identity


【解决方案1】:

我认为你应该检查 ApiResource 配置。无论您在 ApiResource 配置的 UserClaims 属性中添加什么声明,这些声明都将出现在访问令牌中。例如

 public IEnumerable<ApiResource> GetApiResources()
 {
      return new List<ApiResource>
      {
            new ApiResource("api1")
            {
                UserClaims = new[] { "CustomClaim1", "CustomClaim2"},
            }, 
       }
 }

在上面的代码中,访问代码将包含 CustomClaim1CustomClaim2。因此,如果您不提及它们,它们将不会出现在访问令牌中。希望这会有所帮助!

【讨论】:

【解决方案2】:

您可以使用IProfileService 向 JWT 令牌添加自定义声明:

public class MyProfileService : IProfileService
{
    public MyProfileService()
    { }

    public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {

        var claims = new List<Claim>()
        {

            new Claim(ClaimTypes.Role, "Admin")
        };
        context.IssuedClaims.AddRange(claims);
        return Task.CompletedTask;
    }

    public Task IsActiveAsync(IsActiveContext context)
    {
        // await base.IsActiveAsync(context);
        return Task.CompletedTask;
    }
}

关注 ID Token 的长度,默认情况下,声明不会包含在 ID 令牌中,而是会从 OIDC 的 userinfo 端点获取声明。你可以:

  1. 从 React 模板中的user.profile 获取声明,它会自动向带有 id token 的 userinfo 端点发送请求。

  2. 或者您可以在 Identity Server 4 中注册客户端时在客户端选项中将 AlwaysIncludeUserClaimsInIdToken 设置为 true,但恐怕您不需要使用 ApiAuthorization 服务,IdentityServer 的全部功能仍然可以使用自定义身份验证以满足您的需求。

【讨论】:

  • 我认为您关于不使用ApiAuthorization 的评论可能一针见血。我认为它的 atm 记录不够好(至少对我而言),因此直接使用 IdentityServer 而不是通过这种抽象可能更容易。 IdentityServer 本身的文档记录要好得多。
  • 是的,ApiAuthorization 只是将 IdentityServer 配置为使用模板支持的配置,但与 Identity Server 提供的配置相比,该配置并未完全自定义
  • 嗨,南,你碰巧有一个例子说明你是如何工作的吗?我无法让我的自定义声明出现在反应模板中的 user.profile 上
  • 你是否在 statup.cs 中注册了 IProfileService ?services.AddTransient();
猜你喜欢
  • 2021-09-24
  • 2019-02-26
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2019-10-01
  • 2021-10-31
  • 2017-10-09
相关资源
最近更新 更多