Asp.net web api 转发当前访问令牌或为代理请求新令牌可以吗

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

TL;DR

我需要在客户端应用程序和webapi之间创建一个代理,例如

客户端应用程序proxywebapi(由oauth2保护)

代理应该只是将访问令牌转发给webapi,还是请求一个新的访问令牌

详细信息

目前,有一个客户端应用程序和一个webapi。要访问webapi,客户端应用程序需要提供访问令牌

i、 e.客户端webapi(由oauth2保护)

一切正常

然而,由于某些原因,有一个新的需求,即在客户端和webapi之间使用asp.net核心创建代理服务器

i、 e.客户代理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/[控制器]”)]
[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来提供示例?:)