我正在开发一个ASP.Net核心web应用程序,其中我需要创建一种"身份验证代理",以连接到另一个(外部)web服务.
我所说的身份验证代理的意思是,我将通过我的web应用程序的特定路径接收请求,并且必须判断这些请求的标题,以获取我之前发出的身份验证令牌,然后将具有相同请求字符串/内容的所有请求重定向到外部web API,我的应用程序将通过HTTP Basic auth进行身份验证.
以下是伪代码中的整个过程
- 客户通过向我之前发送给他的唯一URL发送帖子来请求令牌
- 我的应用程序向他发送了一个唯一的令牌来回应这篇帖子
- 客户端向我的应用程序的特定URL发出GET请求,比如
/extapi
,并在HTTP头中添加身份验证令牌 - 我的应用程序收到请求,判断身份验证令牌是否存在且有效
- 我的应用程序对外部web API执行相同的请求,并使用基本身份验证对请求进行身份验证
- 我的应用程序接收请求的结果并将其发送回客户端
这是我现在所拥有的.它似乎工作得很好,但我想知道它是否真的应该这样做,或者是否没有更优雅或更好的解决方案?从长远来看,这种解决方案是否会为扩展应用程序带来问题?
[HttpGet]
public async Task GetStatement()
{
//TODO check for token presence and reject if issue
var queryString = Request.QueryString;
var response = await _httpClient.GetAsync(queryString.Value);
var content = await response.Content.ReadAsStringAsync();
Response.StatusCode = (int)response.StatusCode;
Response.ContentType = response.Content.Headers.ContentType.ToString();
Response.ContentLength = response.Content.Headers.ContentLength;
await Response.WriteAsync(content);
}
[HttpPost]
public async Task PostStatement()
{
using (var streamContent = new StreamContent(Request.Body))
{
//TODO check for token presence and reject if issue
var response = await _httpClient.PostAsync(string.Empty, streamContent);
var content = await response.Content.ReadAsStringAsync();
Response.StatusCode = (int)response.StatusCode;
Response.ContentType = response.Content.Headers.ContentType?.ToString();
Response.ContentLength = response.Content.Headers.ContentLength;
await Response.WriteAsync(content);
}
}
_httpClient
是一个在其他地方实例化的HttpClient
类,是一个单例,有BaseAddress
http://someexternalapp.com/api/
个
此外,是否有比手动创建/判断令牌更简单的方法?