为什么在 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 应用程序,调用 Authorization
和 Token
端点的上下文有很大不同:第一个是在上下文中执行的浏览器,因此包含一些 browser-specific headers,例如语言环境,当第二个是 server-to-server(后台通道)调用时。
关于您的 sub-question IProfileService 调用:每次令牌或响应包含 UserClaims
时都会发生。当您请求 id_token
、access_token
然后从 UserInfo
端点检索一些额外数据时,您的 IProfileService
可能会被调用三次。
预期行为 如果用户通过您的 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 应用程序,调用 Authorization
和 Token
端点的上下文有很大不同:第一个是在上下文中执行的浏览器,因此包含一些 browser-specific headers,例如语言环境,当第二个是 server-to-server(后台通道)调用时。
关于您的 sub-question IProfileService 调用:每次令牌或响应包含 UserClaims
时都会发生。当您请求 id_token
、access_token
然后从 UserInfo
端点检索一些额外数据时,您的 IProfileService
可能会被调用三次。