为什么在Grant_type =“ code”时执行CustomTokenRequestValidator服务?

时间:2019-07-26 11:57:37

标签: c# oauth oauth-2.0 openid identityserver4

期望的行为 如果用户通过您的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)
}

2 个答案:

答案 0 :(得分:1)

根据{{​​3}},每种授权类型都会调用

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应用程序,对AuthorizeRequestValidatorAuthorization端点的调用上下文有很大不同:第一个调用是在浏览器的上下文中执行的,因此其中包含一些特定于浏览器的标头,例如语言环境,而第二个标头是服务器到服务器(反向通道)的调用。

关于您的有关IProfileService调用的子问题:每当令牌或响应包含Token时都会发生。当您请求UserClaimsid_token,然后从access_token端点检索一些其他数据时,您的UserInfo可能会被调用三次。