期望的行为 如果用户通过您的SPA Web应用程序登录,并且该应用程序使用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)
}
答案 0 :(得分:1)
ICustomAuthorizeRequestValidator
。话虽如此,您将CustomTokenRequestValidationContext
传递到ValidateAsync
中,其中TokenRequestValidationResult
具有ValidatedTokenRequest
,后者又具有GrantType
属性,因此,如果您只打算运行有关客户端凭据的一些代码-一个简单的if语句就足够了:
public async Task ValidateAsync(CustomTokenRequestValidationContext context)
{
if (context.Result.ValidatedRequest.GrantType == "client_credentials")
{
...your logic
}
}
答案 1 :(得分:1)
如果查看流程described by the spec,您会发现code flow
至少包含两个对Authorization Server
的调用,第二个是对{{1}的调用},触发Token Endpoint
调用,以及每次对TokenRequestValidator
的调用都会相应触发AuthorizationEndpoint
。
对于无关紧要的SPA和本机应用程序,但是对于MVC应用程序,对AuthorizeRequestValidator
和Authorization
端点的调用上下文有很大不同:第一个调用是在浏览器的上下文中执行的,因此其中包含一些特定于浏览器的标头,例如语言环境,而第二个标头是服务器到服务器(反向通道)的调用。
关于您的有关IProfileService调用的子问题:每当令牌或响应包含Token
时都会发生。当您请求UserClaims
,id_token
,然后从access_token
端点检索一些其他数据时,您的UserInfo
可能会被调用三次。