我正在开发一个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类,是一个单例,有BaseAddresshttp://someexternalapp.com/api/

此外,是否有比手动创建/判断令牌更简单的方法?

推荐答案

我最终实现了一个受a project in Asp.Net's GitHub启发的代理中间件.

它基本上实现了一个中间件,该中间件读取接收到的请求,从中创建一个副本并将其发送回已配置的服务,从服务读取响应并将其发送回调用方.

Asp.net相关问答推荐

try 在 .net 中使用 MS Graph 添加新的应用程序角色时出现 ODataError

Stimulsoft 没有在智能手机中显示正确的 pdf 字体

在 DataTextField 中组合两个字段.这可能吗?

如何为发布模式设置调试错误

使用 jQuery 验证插件匹配两个字段

使用 jQuery.ajax() 时如何处理错误?

ASP.NET 在更新面板更新时显示正在加载...消息

如何使图像的一部分成为可点击的链接

我应该使用用户名还是用户 ID 来引用 ASP.NET 中经过身份验证的用户

__doPostBack 未定义

如何使用自动生成的列隐藏 ASP.NET GridView 中的列?

如何从 HTTP 请求中获取 MAC 地址?

ASP.NET Core 2.0 为同一端点结合了 Cookie 和承载授权

GMT 和 UTC 一样吗?

如何获得 System.Diagnostics.Process 的输出?

使用 Twitter Bootstrap 在 @html.actionlink 中显示 html

人们使用 JScript.Net 的目的是什么?

URL 路由、图像处理程序和潜在危险的 Request.Path 值

为什么 Controls 集合不提供所有 IEnumerable 方法?

Application_End global.asax