扩展授予-无效的授予类型委托-Identity Server 4 .NET Core 2.2

时间:2019-10-10 08:27:19

标签: asp.net-core identityserver4

我试图通过遵循HERE中的教程(实际上是一页)来找出如何与delegation一起实现client credentials授予类型,因为我有和API1资源调用另一个API2资源。

我已经实现了IExtensionGrantValidator,并使用它们提供的类名从文档中复制了代码,并添加了授权类型为client的{​​{1}}。但是,我不确定下面在何处以及如何调用此方法,首先我是从delegation调用它的,并尝试将最初调用API1的JWT传递给client方法,但是我一直保持得到DelegateAsync

在API 1中,您现在可以自己构造HTTP有效负载,或使用IdentityModel帮助器库:

bad request

因此,我从API1开始尝试在名为 public async Task<TokenResponse> DelegateAsync(string userToken) { var payload = new { token = userToken }; // create token client var client = new TokenClient(disco.TokenEndpoint, "api1.client", "secret"); // send custom grant to token endpoint, return response return await client.RequestCustomGrantAsync("delegation", "api2", payload); } 的方法中请求令牌,该方法尝试调用API2中的方法:

GetAPI2Response

但是,这在调试 [HttpGet] [Route("getapi2response")] public async Task<string> GetApi2Response() { var client = new HttpClient(); var tokenResponse = await client.RequestTokenAsync(new TokenRequest { Address = "http://localhost:5005/connect/token", GrantType = "delegation", ClientId = "api1_client", ClientSecret = "74c4148e-70f4-4fd9-b444-03002b177937", Parameters = { { "scope", "stateapi" } } }); var apiClient = new HttpClient(); apiClient.SetBearerToken(tokenResponse.AccessToken); var response = await apiClient.GetAsync("http://localhost:6050/api/values"); if (!response.IsSuccessStatusCode) { Debug.WriteLine(response.StatusCode); } else { var content = await response.Content.ReadAsStringAsync(); return content; } return "failed"; } 时返回。奇怪的是,我注意到在运行IDSRV时,invalid grant type方法中的代码没有被点击,直到您单击IExtensionGrantValidator的链接,然后它显示为discovery docs

我显然做错了,因为我没有包括文档中提到的grant type方法,因为我不清楚它的去向。

1 个答案:

答案 0 :(得分:1)

文档似乎有些过时了。使用实际的扩展方法,必须有以下内容:

var tokenResponse = await client.RequestTokenAsync(new TokenRequest
{
    Address = "http://localhost:5005/connect/token",
    GrantType = "delegation",
    ClientId = "api1_client",
    ClientSecret = "74c4148e-70f4-4fd9-b444-03002b177937",
    Parameters = new Dictionary<string, string>{{ "token", userToken }, { "scope", "stateapi" } }
})

您已经实现了它,但是忘记添加初始令牌。从GetApi2Response()中提取它时,它就可以成为您的DelegateAsync

然后,您在Identityserver中的客户端配置必须包含 api1_client delegation GrantType。另外请不要忘记注册:

services.AddIdentityServer().AddExtensionGrantValidator<YourIExtensionGrantValidatorImpl>()