如何仅在扩展授予类型中添加自定义声明

时间:2018-05-31 15:02:50

标签: asp.net-core identityserver4

我想在我的扩展程序授予类型中添加自定义声明。 并且我的代码类似于我的类中实现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") });
    }

1 个答案:

答案 0 :(得分:1)

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

首先索赔必须由客户使用适当的范围请求。在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,但足以派生一个现有的方法而仅覆盖一个方法。