将收到的令牌从一项服务传递到另一项服务
Pass received token from one service to another
我有这个相当简单 use-case:
- 资源所有者使用我的 Angular 客户端从 IDP 获取 JWT 令牌
- Angular 客户端使用 IDP 颁发的访问令牌调用服务 A (WebAPI)
- Angular 客户端使用 IDP 颁发的访问令牌调用服务 B (WebAPI)
我想支持以下场景:
- 让服务 A 像 Angular 客户端和 pass-through 它收到的访问令牌来调用服务 B
所以基本上,服务 B 可以直接由 Angular 客户端或服务 A 调用。在这两种情况下,都必须为其提供 Bearer 令牌才能访问任何 WebAPI 端点。
对于服务 A,我不知道如何存储提供的令牌,以便稍后当我需要使用 HttpClient
调用服务 B 时,我可以设置 Bearer
header.
如果我理解正确,您的要求是调用第二个 API(服务 B)作为对 服务 A 的单个请求的一部分 来自经过身份验证的用户。
如果是这种情况,那么我认为没有理由存储令牌server-side,您可以直接从当前请求中取出Authorization
header并重新使用它调用 服务 B。
一些代码可能有助于解释我的意思,假设 ControllerA
是一个 Service A 控制器:
public class ControllerA : ApiController
{
public async Task<IHttpActionResult> GetFromB()
{
var token = Request.Headers.Authorization.Parameter;
MyModel result = null;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
var response = await client.GetAsync("http://serviceb/controllerb/actionb");
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsAsync<MyModel>();
}
return Ok(result);
}
}
我有这个相当简单 use-case:
- 资源所有者使用我的 Angular 客户端从 IDP 获取 JWT 令牌
- Angular 客户端使用 IDP 颁发的访问令牌调用服务 A (WebAPI)
- Angular 客户端使用 IDP 颁发的访问令牌调用服务 B (WebAPI)
我想支持以下场景:
- 让服务 A 像 Angular 客户端和 pass-through 它收到的访问令牌来调用服务 B
所以基本上,服务 B 可以直接由 Angular 客户端或服务 A 调用。在这两种情况下,都必须为其提供 Bearer 令牌才能访问任何 WebAPI 端点。
对于服务 A,我不知道如何存储提供的令牌,以便稍后当我需要使用 HttpClient
调用服务 B 时,我可以设置 Bearer
header.
如果我理解正确,您的要求是调用第二个 API(服务 B)作为对 服务 A 的单个请求的一部分 来自经过身份验证的用户。
如果是这种情况,那么我认为没有理由存储令牌server-side,您可以直接从当前请求中取出Authorization
header并重新使用它调用 服务 B。
一些代码可能有助于解释我的意思,假设 ControllerA
是一个 Service A 控制器:
public class ControllerA : ApiController
{
public async Task<IHttpActionResult> GetFromB()
{
var token = Request.Headers.Authorization.Parameter;
MyModel result = null;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
var response = await client.GetAsync("http://serviceb/controllerb/actionb");
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsAsync<MyModel>();
}
return Ok(result);
}
}