2017-10-12 168 views
0

我有一个基本的IdentityServer4令牌服务器,一个Api和一个基于identityserver4文档教程使用client_credentials的测试客户端应用程序设置。IdentityServer4 IExtensionGrantValidator

我们有一个预先构建的客户端应用程序,用户使用他们现有的凭据登录,这些凭据不与IdentityServer4绑定。客户端应用程序将使用client_credentials工作流调用Api,因为我不想为可能需要访问Api的每个客户端应用程序创建多个用户。

在IdentityServer4上使用上述设置我已使用client_Credentials工作流程正常工作。我面临的问题是虽然我不需要个人用户进行身份验证,但我仍然想通过user_id知道他们是谁。我可以简单地将& user_id = 9999添加到令牌请求中,但我找不到在请求发出时从令牌服务器检索此信息的方法。经过一些研究后,我遇到了IExtensionGrantValidator,它允许我添加一个cstom授权类型并拦截请求并执行一些自定义处理。问题是,即使它看起来好像我正确设置它,我仍然得到invalid_grant错误。

下面是代码:

public class CustomGrantValidator : IExtensionGrantValidator 
{ 
    public string GrantType => "custom_credentials"; 

    public Task ValidateAsync(ExtensionGrantValidationContext context) 
    { 
     return Task.FromResult(context.Result); 
    } 
} 

在新的客户端块:

AllowedGrantTypes = 
{ 
    GrantType.ClientCredentials, 
    "custom_credentials" 
}, 

在启动

.AddExtensionGrantValidator<CustomGrantValidator>(); 

我是新来IdentityServer4和.net核心,所以我我确信我做错了一件事,或者不了解这里的基本机制。

回答

0

我发现这是因为我遇到了同样的错误,但我相信你的验证器是无用的,因为它什么都不做。您需要在上下文中设置结果,如下所示:

 var claims = new List<Claim>(); 

     claims.Add(new Claim("sub", userToken)); 
     claims.Add(new Claim("role", "admin")); 

     context.Result = new GrantValidationResult(userToken, "delegation", claims: claims); 

我看到的每个示例都通过添加此值来设置结果。