2016-05-31 51 views
0

我有这个非常简单的用例:通接收的令牌从一个服务到另一个

  • 资源所有者使用我的角客户端从IDP获得JWT令牌
  • 角客户端调用服务A(的WebAPI)由IDP
  • 角客户端调用服务B(的WebAPI)与IDP发出的访问令牌

我想支持以下情形发出的访问令牌:

  • 有无服务行动的授权,如角客户端和直通的访问令牌收到作出服务B键

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

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

+0

你能否解释一下为什么你需要存储的令牌服务器端?您是否需要在没有用户干预的情况下执行请求(例如计划任务)? –

+0

假设服务B提供了服务A依赖的某些功能。因此,当用户呼叫服务A时,我想使用相同的令牌(来自服务A)来呼叫服务B.所以基本上服务A使用它所需的令牌,然后通过令牌传递给服务B. –

回答

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); 
    } 
} 
+0

是的,那正是我需要的。我没有意识到OWIN中间件保存了授权信息。谢谢! –

相关问题