将收到的令牌从一个服务传递到另一个服

时间:2016-05-31 22:48:45

标签: angularjs asp.net-web-api identityserver3

我有这个相当简单的用例:

  • 资源所有者使用我的Angular客户端从IDP获取JWT令牌
  • Angular客户端使用IDP颁发的访问令牌调用服务A(WebAPI)
  • Angular客户端使用IDP颁发的访问令牌调用服务B(WebAPI)

我想支持以下情况:

  • 让服务行为像Angular客户端一样,并通过它收到的访问令牌来调用服务B

基本上,服务B可以由Angular客户端直接调用,也可以由服务A调用。在这两种情况下,必须提供一个Bearer令牌才能访问任何WebAPI端点。

从服务A,我不知道如何存储提供的令牌,以便稍后当我需要使用HttpClient来呼叫服务B时,​​我可以设置Bearer标头。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您的要求是将第二个API(服务B )作为来自经过身份验证的用户的服务A 的单个请求的一部分。

如果是这种情况,那么我认为没有理由存储令牌服务器端,您可以从当前请求中取出Authorization标头并重新使用它来调用服务B

有些代码可能有助于解释我的意思,假设ControllerA服务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);
    }
}