使用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),以便提供良好的用户体验。

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

engkeluu 回答:使用Microsoft.AspNetCore.ApiAuthorization.IdentityServer

我认为您应该检查 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令牌的长度,默认情况下,声明将不包括在ID令牌中,而是从OIDC的userinfo端点获取声明。您可以:

  1. 在React模板中从user.profile获取声明,它将自动向ID为的userinfo端点发送请求。

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

本文链接:https://www.f2er.com/3136454.html

大家都在问