我试图通过遵循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
方法,因为我不清楚它的去向。
答案 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>()