我正在开发一个ASP.Net Core Web应用程序,需要创建一种“认证代理”,以连接到另一个(外部)Web服务。
所谓的认证代理是指,我将通过Web应用程序的特定路径接收请求,并检查这些请求的头部是否包含我之前发布的身份验证令牌,然后将所有相同请求字符串/内容的请求重定向到一个外部Web API,我的应用程序将通过HTTP基本身份验证进行身份验证。
以下是伪代码中整个过程:
1.客户端通过在我前面发送的唯一URL上进行POST来请求令牌 2.我的应用程序对此POST作出响应并向其发送一个唯一的令牌。 3.客户端向我的应用程序的特定URL发出GET请求,并在HTTP标题中添加auth-token 4.我的应用程序获取请求,检查auth-token是否存在且有效 5.我的应用程序执行相同的请求到外部Web API,并使用BASIC身份验证对请求进行身份验证。 6.我的应用程序接收请求结果并将其发送回客户端。
以上是目前的实现方式,看起来运行正常,但我想知道是否有更优雅的解决方案?那种解决方案能否在长期运行中为扩展应用程序带来问题?
所谓的认证代理是指,我将通过Web应用程序的特定路径接收请求,并检查这些请求的头部是否包含我之前发布的身份验证令牌,然后将所有相同请求字符串/内容的请求重定向到一个外部Web API,我的应用程序将通过HTTP基本身份验证进行身份验证。
以下是伪代码中整个过程:
1.客户端通过在我前面发送的唯一URL上进行POST来请求令牌 2.我的应用程序对此POST作出响应并向其发送一个唯一的令牌。 3.客户端向我的应用程序的特定URL发出GET请求,并在HTTP标题中添加auth-token 4.我的应用程序获取请求,检查auth-token是否存在且有效 5.我的应用程序执行相同的请求到外部Web API,并使用BASIC身份验证对请求进行身份验证。 6.我的应用程序接收请求结果并将其发送回客户端。
以上是目前的实现方式,看起来运行正常,但我想知道是否有更优雅的解决方案?那种解决方案能否在长期运行中为扩展应用程序带来问题?
[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/
。
还有,是否有比手动创建 / 检查令牌更简单的方法?