簡體   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