首页 > 解决方案 > 如何仅在扩展授权类型中添加自定义声明

问题描述

我想在我的扩展授权类型中添加自定义声明。并且我的代码在实现 IExtensionGrantValidator 的类中类似于以下代码,但由此产生的令牌不包含添加的 custome_claim

        public async Task ValidateAsync(ExtensionGrantValidationContext context)
        {
        var userToken = context.Request.Raw.Get("token");

        if (string.IsNullOrEmpty(userToken))
        {
            context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant);
            return;
        }

        var result = await _validator.ValidateAccessTokenAsync(userToken);
        if (result.IsError)
        {
            context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant);
            return;
        }

        var sub = result.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;

        context.Result = new GrantValidationResult(sub, "graph_delegation", new List<Claim> { new Claim("custome_claim", "Hello from the custom grant") });
    }

标签: asp.net-coreidentityserver4

解决方案


该过程由三个部分组成,并且对于发布具有自定义声明的任何访问令牌都是相同的,不仅对于扩展授权:

首先,客户必须使用适当的范围来请求索赔。在 Identity Server 端GetApiResources(),方法必须将该声明类型添加到适当的范围内。

    public static IEnumerable<ApiResource> GetApiResources(){
        return new List<ApiResource>{
             new ApiResource{
                    Name = "API 1",
                    DisplayName = "API 1",
                    Scopes = {
                        new Scope {
                            Name = "my-api",
                            UserClaims =  {
                                JwtClaimTypes.SessionId,
                                JwtClaimTypes.Role,
                                Constants.TenantIdClaimType,
                                "custom_claim" }
                        }
                    }
                }               
            };
      }

其次,必须以某种方式发出声明——一种方法是使用GrantValidationResult构造函数,如上面原始帖子中所述,将其放入。

最后,应将请求的声明添加到令牌的 IssuedClaims 集合中。这是ProfileService实施的工作。ProfileService应在 IdSrv 启动中实现和注册自定义,如下所示:

    services.AddIdentityServer()
        ***
        .AddInMemoryApiResources(GetApiResources())
        .AddExtensionGrantValidator<DelegationGrantValidator>()
        .AddProfileService<ExtendedProfileService>();

在哪里

    public override Task GetProfileDataAsync(ProfileDataRequestContext context)

行:context.AddRequestedClaims(context.Subject.Claims);将完成这项工作。不必IProfileService从头开始实现,但足以派生现有的方法并仅覆盖一种方法。


推荐阅读