我正在开发一个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相关问答推荐

由于 Blazor Change Detection API,组件重新渲染被跳过.如何避免?

如何防止 IISExpress 和我的网站文件夹弄乱我的文档文件夹?

如何从 JavaScript 调用 C# 函数?

ASP MVC 授权除少数之外的所有操作

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

MSCharts找不到请求类型'GET'的http处理程序错误

如何在 FileUpload 控件中限制文件类型

asp.net mvc 中的 RedirectToAction 用法

问题映射 HttpHandler --> HTTP Error 404 Not Found

ASP.Net:在共享/静态函数中使用 System.Web.UI.Control.ResolveUrl()

获取页面上特定类型的所有 Web 控件

如何从 SQL Server 2008 本身获取客户端 IP 地址?

如何获取正在访问 ASP.NET 应用程序的当前用户?

带有 ASP.NET WebMethod 的 Jquery AJAX 返回整个页面

如何将参数传递给 ASP.NET MVC 2 中的自定义 ActionFilter?

不同域的登录页面

ASP .NET 单例

MVC 模型布尔显示是或否

如何告诉 RadioButtonList 不生成表格

在 ASP.NET 中使用 SecureString 有什么好处吗?