TL; DR
例如,我需要在客户端应用和webapi之间创建一个代理。
客户端应用<---> 代理 <---> webapi(受oauth2保护)
代理是将访问令牌转发到webapi还是请求新的访问令牌?
详细
当前,有一个客户端应用程序和一个webapi。要访问webapi,客户端应用需要提供访问令牌。
即客户端<---> webapi(由oauth2保护)
一切正常。
但是,由于某种原因,有一个新的要求,那就是在客户端和Webapi之间使用asp.net核心创建代理服务器。
即客户<---> 代理 <---> webapi
代理代码如下:
[Route("api/[controller]")]
[ApiController]
public class ProxyController : ControllerBase
{
[Authorize]
[HttpGet]
public async Task<ActionResult<object>> Invoke()
{
using (HttpClient client = new HttpClient())
{
//GET ACCESS TOKEN FROM CURRENT REQUEST
var accessToken = await HttpContext.GetTokenAsync("access_token"); ;
client.SetBearerToken(accessToken);
var response = await client.GetAsync("https://demo.identityserver.io/api/test");
if (!response.IsSuccessStatusCode)
{
return response.StatusCode;
}
else
{
var content = await response.Content.ReadAsStringAsync();
return content;
}
}
}
}
如您所见,我只是使用当前访问令牌,然后向真正的api发送请求。
为了安全起见,我不知道可以利用当前的访问令牌。我应该为代理请求一个新的访问令牌并向真正的api请求吗?
答案 0 :(得分:1)
如果您想要教科书答案,那么可以,您的代理api应该同时成为api资源和客户端。它应该具有一个新的作用域,即外部客户端应为其请求访问令牌的范围,而不是您的实际api。然后,它还应在实际api范围内使用客户端凭据流和请求令牌,并在将原始请求代理到预期的目标url时使用该令牌。
话虽如此,我个人还是处理过类似的情况,即使我们最初的方法是使用我先前描述的流程,但最终也只是代理令牌。改变主意的主要原因是业务需求不断发展,并且在实际的api中需要基于粒度的基于客户端的授权。我们尝试使用自定义赠款来模拟外部客户的假冒行为,但这总体上是一场噩梦。
最后,我们使用这种代理方法对安全风险进行了简要评估,并且由于我们同时拥有代理和实际的api,并且仅使用了机器对机器的通信流,因此无法识别任何内容。但是,如果使用这种方法可能会带来安全隐患,我不会感到惊讶。