为什么在 grant_type="code" 时执行 ICustomTokenRequestValidator 服务?

Why does CustomTokenRequestValidator service get executed when 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)
}

ICustomAuthorizeRequestValidator 根据 source code 为每种授权类型调用。话虽如此,您将 CustomTokenRequestValidationContext 传递到 ValidateAsync 中,其中 TokenRequestValidationResult 具有 ValidatedTokenRequest,而 ValidatedTokenRequest 又具有 GrantType 属性,因此如果您旨在仅 运行 客户端凭据上的一些代码 - 一个简单的 if 语句就足够了:

public async Task ValidateAsync(CustomTokenRequestValidationContext context)
{
    if (context.Result.ValidatedRequest.GrantType == "client_credentials")
    {
    ...your logic
    }
}

如果查看流程 described by the spec,您会发现 code flow 至少包含两次对 Authorization Server 的调用,而第二个调用是对 Token Endpoint,触发 TokenRequestValidator 调用,以及每次调用 AuthorizationEndpoint 相应地触发 AuthorizeRequestValidator

对于 SPA 和本机应用程序无关紧要,但对于 MVC 应用程序,调用 AuthorizationToken 端点的上下文有很大不同:第一个是在上下文中执行的浏览器,因此包含一些 browser-specific headers,例如语言环境,当第二个是 server-to-server(后台通道)调用时。

关于您的 sub-question IProfileService 调用:每次令牌或响应包含 UserClaims 时都会发生。当您请求 id_tokenaccess_token 然后从 UserInfo 端点检索一些额外数据时,您的 IProfileService 可能会被调用三次。