Почему служба CustomTokenRequestValidator запускается, когда grant_type="code"?

Ожидаемое поведение Если пользователь вошел в систему через ваше веб-приложение SPA, и приложение использует grant_type=code, ожидается, что будет выполнена только служба «ProfileDataRequestContext». Однако он также выполняет службу ICustomTokenRequestValidator, почему? Я делаю что-то неправильно?

public class ProfileService : IProfileService
{
  //this should be executed only when grant_type=code
}

-

public class CustomTokenRequestValidatorService : ICustomTokenRequestValidator
{
 //this should only be executed when grant_type=clientcredentials (however it always gets executed at all times)
}

Почему вы думаете, что это будет только для client_credentials? Я считаю, что это будет выполняться для всех запросов конечной точки token точно так же, как ICustomAuthorizeRequestValidator выполняется для всех запросов конечной точки authorize.

mackie 26.07.2019 14:53

Я думал, что IProfileService предназначен только для токена пользователя, а CustomTokenRequestValidationContext — для токена доступа? Это правильно? Я только что понял, что веб-приложение SPA получает два токена: один токен идентификатора пользователя, а другой токен доступа. поэтому он выполняется дважды :)

001 27.07.2019 05:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
427
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

ICustomAuthorizeRequestValidator вызывается для каждого типа гранта в соответствии с исходный код. Сказав это, вы получаете CustomTokenRequestValidationContext, переданное в ValidateAsync, у которого есть TokenRequestValidationResult, у которого есть ValidatedTokenRequest, который, в свою очередь, имеет свойство GrantType, поэтому, если вы хотите запустить некоторый код только с учетными данными клиента, должно быть достаточно простого оператора if:

public async Task ValidateAsync(CustomTokenRequestValidationContext context)
{
    if (context.Result.ValidatedRequest.GrantType == "client_credentials")
    {
    ...your logic
    }
}
Ответ принят как подходящий

Если вы посмотрите на поток, описывается спецификацией, вы увидите, что code flow состоит как минимум из двух вызовов Authorization Server, а второй вызов Token Endpoint, запускающий вызов TokenRequestValidator, а также каждый вызов AuthorizationEndpoint запускает AuthorizeRequestValidator соответственно .

Для SPA и нативных приложений это не имеет значения, но для приложений MVC контекст вызовов конечных точек Authorization и Token сильно различается: первый выполняется в контексте браузера, поэтому содержит некоторые специфичные для браузера заголовки, такие как locale, когда второй является вызовом между серверами (обратный канал).

Что касается вашего подвопроса о вызове IProfileService: это происходит каждый раз, когда токен или ответ содержат UserClaims. Когда вы запрашиваете id_token, access_token, а затем получаете дополнительные данные из конечной точки UserInfo, ваш IProfileService может вызываться три раза.

Я думал, что profileservice вызывается только тогда, когда требуется id_token, чтобы получить только информацию о пользователе? IProfileService предназначен для токена пользователя, а CustomTokenRequestValidationContext — для токена доступа?

001 27.07.2019 05:48

RequestValidators, а также их контексты постоянно привязаны к своим конечным точкам, а не к типам токенов. вы можете получить оба токена из AuthorizationEndpoint (неявный поток), оба из TokenEndpoint (поток кода) и смешать их (гибрид). который вызывает валидаторы по-разному. и IProfileService -- это просто получение запросов пользователей, любой токен может потребовать этого: id_token обязательно и access_token -- опционально

d_f 27.07.2019 10:47

Другие вопросы по теме