Asp.net web api 转发当前访问令牌或为代理请求新令牌可以吗
TL;DR 我需要在客户端应用程序和webapi之间创建一个代理,例如 客户端应用程序proxywebapi(由oauth2保护) 代理应该只是将访问令牌转发给webapi,还是请求一个新的访问令牌 详细信息 目前,有一个客户端应用程序和一个webapi。要访问webapi,客户端应用程序需要提供访问令牌 i、 e.客户端webapi(由oauth2保护) 一切正常 然而,由于某些原因,有一个新的需求,即在客户端和webapi之间使用asp.net核心创建代理服务器 i、 e.客户代理webapi 代理代码如下所示:Asp.net web api 转发当前访问令牌或为代理请求新令牌可以吗,asp.net-web-api,proxy,oauth-2.0,openid-connect,Asp.net Web Api,Proxy,Oauth 2.0,Openid Connect,TL;DR 我需要在客户端应用程序和webapi之间创建一个代理,例如 客户端应用程序proxywebapi(由oauth2保护) 代理应该只是将访问令牌转发给webapi,还是请求一个新的访问令牌 详细信息 目前,有一个客户端应用程序和一个webapi。要访问webapi,客户端应用程序需要提供访问令牌 i、 e.客户端webapi(由oauth2保护) 一切正常 然而,由于某些原因,有一个新的需求,即在客户端和webapi之间使用asp.net核心创建代理服务器 i、 e.客户代理webap
[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/[控制器]”)]
[ApiController]
公共类代理控制器:ControllerBase
{
[授权]
[HttpGet]
公共异步任务调用()
{
使用(HttpClient=new HttpClient())
{
//从当前请求获取访问令牌
var accessToken=await-HttpContext.GetTokenAsync(“访问令牌”);
client.SetBearerToken(accessToken);
var response=wait client.GetAsync(“https://demo.identityserver.io/api/test");
如果(!response.issucessStatusCode)
{
返回response.StatusCode;
}
其他的
{
var content=await response.content.ReadAsStringAsync();
返回内容;
}
}
}
}
如您所见,我只是使用当前的访问令牌,然后向真正的api发出请求
为了安全起见,我不知道使用当前的访问令牌是否可以。我是否应该为代理请求一个新的访问令牌并向真正的api发出请求?如果您想要教科书式的答案,那么是的,您的代理api应该成为api资源和客户端。它应该有一个新的作用域,外部客户端应该为其请求访问令牌,而不是实际的api。然后,它还应该在实际api的范围内使用客户端凭据流和请求令牌,并在将原始请求代理到预期的目标url时使用该令牌 话虽如此,我个人也处理过类似的情况,最后也只是代理代币,尽管我们最初的方法是使用我前面描述的流程。改变主意的主要原因是业务需求不断发展,在实际的api中需要更细粒度的基于客户端的授权。我们试图使用自定义授权来模拟外部客户机的模拟,但总体来说这是一场噩梦
最后,我们使用这种代理方法对安全风险进行了简要评估,但无法识别任何内容,因为我们同时拥有代理和实际api,并且只使用了机器到机器的通信流。但是,如果使用这种方法会带来一些潜在的安全隐患,我不会感到惊讶。您好,有什么结果吗?您是如何使用新版本的ASP.NET的?您是否有github来提供示例?:)