繁体   English   中英

使用 Microsoft.AspNetCore.ApiAuthorization.IdentityServer 时,如何在 JWT 和用户主体中添加自定义用户声明

[英]How do I add custom user claims in JWT and user principal when using Microsoft.AspNetCore.ApiAuthorization.IdentityServer

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

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

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

什么是实现这一目标的好方法?

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

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

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

您可以使用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 令牌的 userinfo 端点发送请求。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM