是否可以转发当前访问令牌或为代理请求新令牌?

时间:2019-01-01 04:41:23

标签: asp.net-web-api proxy oauth-2.0 openid-connect

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请求吗?

1 个答案:

答案 0 :(得分:1)

如果您想要教科书答案,那么可以,您的代理api应该同时成为api资源和客户端。它应该具有一个新的作用域,即外部客户端应为其请求访问令牌的范围,而不是您的实际api。然后,它还应在实际api范围内使用客户端凭据流和请求令牌,并在将原始请求代理到预期的目标url时使用该令牌。

话虽如此,我个人还是处理过类似的情况,即使我们最初的方法是使用我先前描述的流程,但最终也只是代理令牌。改变主意的主要原因是业务需求不断发展,并且在实际的api中需要基于粒度的基于客户端的授权。我们尝试使用自定义赠款来模拟外部客户的假冒行为,但这总体上是一场噩梦。

最后,我们使用这种代理方法对安全风险进行了简要评估,并且由于我们同时拥有代理和实际的api,并且仅使用了机器对机器的通信流,因此无法识别任何内容。但是,如果使用这种方法可能会带来安全隐患,我不会感到惊讶。