gpt4 book ai didi

c# - 使用 Asp.net 核心创建另一个 web api 的代理

转载 作者:IT王子 更新时间:2023-10-29 04:08:16 26 4
gpt4 key购买 nike

我正在开发一个 ASP.Net Core Web 应用程序,我需要为另一个(外部)Web 服务创建一种“身份验证代理”。

我所说的身份验证代理是指我将通过我的 Web 应用程序的特定路径接收请求,并且必须检查这些请求的 header 以获得我之前发出的身份验证 token ,然后重定向所有向外部 Web API 发出具有相同请求字符串/内容的请求,我的应用程序将通过 HTTP Basic 身份验证对其进行身份验证。

下面是伪代码的整个过程

  • 客户通过向我之前发送给他的唯一 URL 发送 POST 来请求 token
  • 我的应用向他发送一个唯一 token 以响应此 POST
  • 客户端向我的应用程序的特定 URL 发出 GET 请求,比如 /extapi 并在 HTTP header 中添加 auth-token
  • 我的应用收到请求,检查授权 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 类,并且是一个单例,BaseAddresshttp://someexternalapp。 com/api/

此外,是否有比手动操作更简单的 token 创建/ token 检查方法?

最佳答案

如果有人感兴趣,我使用了 Microsoft.AspNetCore.Proxy 代码并使用中间件使其变得更好。

在这里查看:https://github.com/twitchax/AspNetCore.Proxy . NuGet 在这里:https://www.nuget.org/packages/AspNetCore.Proxy/ . Microsoft 存档了本文中提到的另一个,我计划回应有关此项目的任何问题。

基本上,它允许您在使用 args 路由并计算代理地址的方法上使用属性,从而使反向代理另一个 Web 服务器变得容易得多。

[ProxyRoute("api/searchgoogle/{query}")]
public static Task<string> SearchGoogleProxy(string query)
{
// Get the proxied address.
return Task.FromResult($"https://www.google.com/search?q={query}");
}

关于c# - 使用 Asp.net 核心创建另一个 web api 的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42000362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com