【发布时间】:2017-06-19 09:57:34
【问题描述】:
我正在开发一个 ASP.Net Core Web 应用程序,我需要为另一个(外部)Web 服务创建一种“身份验证代理”。
我所说的身份验证代理的意思是,我将通过我的 Web 应用程序的特定路径接收请求,并且必须检查这些请求的标头以获取我之前发布的身份验证令牌,然后重定向所有向外部 Web API 发出具有相同请求字符串/内容的请求,我的应用将通过 HTTP Basic auth 对其进行身份验证。
这是整个过程的伪代码
- 客户端通过 POST 到我之前发送给他的唯一 URL 来请求令牌
- 我的应用程序向他发送了一个唯一令牌以响应此 POST
- 客户端向我的应用程序的特定 URL 发出 GET 请求,例如
/extapi,并在 HTTP 标头中添加 auth-token - 我的应用收到请求,检查身份验证令牌是否存在且有效
- 我的应用程序向外部 Web API 发出相同的请求,并使用 BASIC 身份验证对请求进行身份验证
- 我的应用从请求中接收结果并将其发送回客户端
这就是我现在所拥有的。它似乎工作正常,但我想知道这是否真的应该这样做,或者是否没有更优雅或更好的解决方案?从长远来看,该解决方案是否会为扩展应用程序带来问题?
[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 类并且是一个单例并且具有 BaseAddressof http://someexternalapp.com/api/
另外,是否有比手动创建更简单的令牌创建/令牌检查方法?
【问题讨论】:
-
IIS 反向代理
-
但是如果您不在 IIS 上托管怎么办?我可能会在 Docker 映像或类似的东西上使用 Kestrel 进行托管。
-
您可以使用任何服务器作为反向代理。因此,启动一个带有反向代理的快速应用程序或任何其他带有反向代理的流行 Web 服务器......
-
我真的看不出这将如何实现。然后如何检查来自反向代理的身份验证令牌?
-
老实说,我真的认为您的代码没有任何问题,我只是将其抽象出来。并确保您明确复制任何标头或查询字符串值以保护自己免受攻击。
标签: c# asp.net asp.net-core-mvc asp.net-core-webapi