Ожидаемое поведение Если пользователь вошел в систему через ваше веб-приложение 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)
}
Я думал, что IProfileService предназначен только для токена пользователя, а CustomTokenRequestValidationContext — для токена доступа? Это правильно? Я только что понял, что веб-приложение SPA получает два токена: один токен идентификатора пользователя, а другой токен доступа. поэтому он выполняется дважды :)





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 — для токена доступа?
RequestValidators, а также их контексты постоянно привязаны к своим конечным точкам, а не к типам токенов. вы можете получить оба токена из AuthorizationEndpoint (неявный поток), оба из TokenEndpoint (поток кода) и смешать их (гибрид). который вызывает валидаторы по-разному. и IProfileService -- это просто получение запросов пользователей, любой токен может потребовать этого: id_token обязательно и access_token -- опционально
Почему вы думаете, что это будет только для
client_credentials? Я считаю, что это будет выполняться для всех запросов конечной точкиtokenточно так же, какICustomAuthorizeRequestValidatorвыполняется для всех запросов конечной точкиauthorize.