Как добавить пользовательскую заявку только в расширенный тип предоставления - PullRequest
0 голосов
/ 31 мая 2018

Я хочу добавить пользовательскую заявку в свой тип расширенного гранта.и мой код подобен следующему в моем классе, который реализует 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 голосов
/ 28 марта 2019

Процесс состоит из трех частей и идентичен для выдачи любого токена доступа с настраиваемыми утверждениями, а не только для предоставления расширения:

Во-первых требование должно быть запрошено клиентом, используя соответствующую область.На стороне 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 с нуля, но достаточно, чтобы извлечь существующий и переопределить только один метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...