[英]Microsoft.AspNetCore.ApiAuthorization.IdentityServer - Use Version 5 Instead of 6
[英]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"},
},
}
}
在上面的代碼中,訪問代碼將包含CustomClaim1和CustomClaim2 。 因此,如果您不提及它們,它們將不會出現在訪問令牌中。 希望這可以幫助!
您可以使用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 端點獲取聲明。 你可以:
從 React 模板中的user.profile
獲取聲明,它會自動向帶有 id 令牌的 userinfo 端點發送請求。
或者您可以在 Identity Server 4 中注冊客戶端時在客戶端選項中將AlwaysIncludeUserClaimsInIdToken
設置為 true,但恐怕您不需要使用ApiAuthorization
服務,IdentityServer 的全部功能仍然可以自定義身份驗證以滿足您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.