百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Yarp.ReverseProxy 实现 dev proxy server

off999 2025-04-09 18:59 28 浏览 0 评论

使用 Yarp.ReverseProxy 实现一个 dev proxy server

Intro

最近在改一个我们前后端分离的一个项目,前端后端是在不同的项目里,前端是一个 React 的纯前端项目,web server 用的 nginx,后端是一个 ASP.NET Core Web Api 项目,原来我们的认证是在纯前端做的一个 implict 认证,认证成功之后 access_token 是存在 local storage 里的,认证过程中的 cookie 也是由前端 javascript 写的,我们安全团队觉得这样不安全,access_token, cookie 应该不能通过前端 javascript 获取到,于是我们就做了一些改造,在前端项目里套了一个 asp.net core web server 认证过程通过 asp.net core 来完成,前端请求 API 的时候通过 cookie 来进行认证授权,由于前后端是分开的,我们调试的时候需要调用测试环境的 API 而直接通过前端去调用的话因为不是一个域名会导致 cookie 不会自动带上去,所以参考前端的做法加了一个 proxy,将本地的 API 请求转发到测试环境的 API 从而避免 cookie 的问题

Sample

我们使用 Yarp.ReverseProxy 来做一个简单的代理,不需要配置 route ,cluster 负载均衡等,我们直接使用 Forward 即可,

首先添加 Yarp.ReverseProxy 引用,这里的示例使用 2.3.0 版本

<PackageReference Include="Yarp.ReverseProxy" Version="2.3.0" />

我们的示例是一个基于 OpenIdConnect 认证的应用,需要登录才能访问,示例里只有 web 没有 API,API 转发到上游服务

部分示例代码如下:

首先注册 Forwarder 服务

builder.Services.AddHttpForwarder();

然后为 Development 环境添加 MapForwarder

if (app.Environment.IsDevelopment())
{
var proxyApiUrl = app.Configuration["AppSettings:ApiUrl"];
ArgumentException.ThrowIf(proxyApiUrl);
app.MapForwarder("/api/{**catch-all}", proxyApiUrl);
app.MapForwarder("/reservation-api/{**catch-all}",
proxyApiUrl,
transformer =>
{
transformer.UseDefaultForwarders = false;
transformer.AddPathRemovePrefix("/reservation-api");
});
}

这里注册了两个路由,一个是 /api/{**catch-all},另外一个是 /reservation-api/{**catch-all}

  • /api/{**catch-all} 直接转发 /api/** 请求到 /api/**
  • /reservation-api/{**catch-all} 转发 /reservation-api/**/**,并禁用默认的 x-forwarded headers

** 是 ASP.NET Core 里支持的路由参数,表示任意路径,包含 /

proxy api url 在配置文件里配置如下:

{
"AppSettings": {
"ApiUrl": "https://reservation.weihanli.xyz/"
}
}

下面写了一个简单的示例,写了一个简单的 js 代码来调用 API


$("#btnApiTest").click(()=>{
$.ajax({
url: '/api/notice', // API 端点
type: 'GET', // 请求方法
dataType: 'json', // 期望的响应数据类型
success: function(response) {
console.log('请求成功:', response); // 打印响应内容
$('#result').html(`api: ${JSON.stringify(response)}`);
},
error: function(xhr, status, error) {
console.error('请求失败:', status, error); // 打印错误信息
}
});
});
$("#btnReservationApiTest").click(()=>{
$.ajax({
url: '/reservation-api/api/notice', // API 端点
type: 'GET', // 请求方法
dataType: 'json', // 期望的响应数据类型
success: function(response) {
console.log('请求成功:', response); // 打印响应内容
$('#result').html(`reservation-api: ${JSON.stringify(response)}`);
},
error: function(xhr, status, error) {
console.error('请求失败:', status, error); // 打印错误信息
}
});
});

/api/notice 测试:

request
response

reservation-api/api/notice

reservation-api request

yarp proxy info:

proxy log

我们这个测试例子需要登录才能访问,我们来看看是否转发请求的时候有没有转发 cookie 到上游服务呢,我们在上游服务中配置了 http logging 中间件来记录 HTTP 请求响应信息,我们看下是否有转发我们的 cookie

http logging info

可以看到我们的 auth cookie 也被一起转发到了上游服务 API

具体代码可以参考:
https://github.com/WeihanLi/SamplesInPractice/tree/main/YarpSamples/DevProxySample

More

这样之后,前端可以本地访问测试环境的 API 了,但是不能够纯前端使用,需要通过 ASP.NET Core 的 web server 来实现认证登录成功之后才能访问 cookie,如果只启动纯前端项目且没有认证 cookie 的时候就会有问题因为没有办法登录,怎么样解决比较好呢,大家有什么好办法吗,欢迎大家留言一起讨论下。

本文的示例,只做演示用,还有部分实现不在演示代码中,比如我们需要为 web 和 api 配置相同的 data protection 这样前后端才能解析同一个 cookie,因为在 asp.net core 中 cookie 是加密的,需要配置 data protection 才可以跨应用跨实例解析同一个 cookie,具体可以参考官方文档

References

  • https://github.com/dotnet/yarp/tree/main/samples/ReverseProxy.Direct.Sample
  • https://github.com/dotnet/yarp/blob/main/samples/ReverseProxy.Direct.Sample/Program.cs
  • https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/yarp/direct-forwarding?view=aspnetcore-9.0&WT.mc_id=DT-MVP-5004222
  • https://github.com/WeihanLi/SamplesInPractice/blob/main/YarpSamples/DevProxySample/Program.cs

相关推荐

软件误删怎么找回来(软件删掉怎么找回)
  • 软件误删怎么找回来(软件删掉怎么找回)
  • 软件误删怎么找回来(软件删掉怎么找回)
  • 软件误删怎么找回来(软件删掉怎么找回)
  • 软件误删怎么找回来(软件删掉怎么找回)
桌面语言栏不见了怎么办(桌面语言栏不见了怎么办呢)

如果您的语言栏在某个应用程序或操作系统中消失了,您可以尝试以下方法来恢复它。首先,您可以检查操作系统的设置,查看语言和区域选项是否正确设置。如果设置正确,但语言栏仍然不可见,您可以尝试重新启动计算机,...

怎么装win98(怎么装win7系统教程)

如何安装windows98  一、具体安装步骤  备份好重要文件之后,就可以安装windows98了。  第一步:启动安装程序。  用户如果原来已安装了windows95/97/98,现在拟对其进行升...

u盘写保护无法格式化怎么解除
  • u盘写保护无法格式化怎么解除
  • u盘写保护无法格式化怎么解除
  • u盘写保护无法格式化怎么解除
  • u盘写保护无法格式化怎么解除
app下载官网(欧歌影视app下载官网)

需要先进入佳能官网的下载页面,选择手机APP下载选项,根据手机操作系统的不同选择相应的下载链接即可成功下载佳能手机APP。下载链接通常会在网站的首页或者是产品页面上提供。总的来说,下载佳能手机APP非...

qq空间相册密码怎么破
  • qq空间相册密码怎么破
  • qq空间相册密码怎么破
  • qq空间相册密码怎么破
  • qq空间相册密码怎么破
互盾手机数据恢复软件下载(互盾数据恢复软件可以免费使用一次吗)

要的。手机如果可以连电脑当做u盘识别就可以用恢复软件。比如用安易。至于能不能出现盘符,可以网上查一下你这个手机型号可不可以,或者问问手机售后。1、安装互盾安卓恢复大师,运行软件后,将手机连接到电脑上...

电脑wifi突然变成红叉搜不到

1、WiFi功能未开启:很多时候出现WiFi红色叉叉图标,可能就是无线WiFi的开关或者按键没有开启导致的。一般的笔记本键盘上面都有一个F5开启WiFi的功能,有的需要结合Fn功能键一起按。每个品牌的...

正版win10系统一键重装官网(一键装机win10正版系统)

1、下载小白一键重装软件,打开软件后选择我们要安装的系统。?2、接着小白给出我们一些常用的电脑软件,大家可根据自己需要进行下载。?3、然后就是我们就耐心的等待系统镜像的下载吧。?4、部署环境完成后我们...

windows8系统自己怎么装(如何安装windows 8)

要在线安装Windows8系统,您可以按照以下步骤操作:1.准备安装媒体:在您的计算机上打开一个现代的网络浏览器(如Chrome、Firefox或Edge),然后前往Microsoft...

win10登录选项没有密码设置(win10没有登陆密码框)

是该电脑没设置密码,所以登录时看不到密码选项。电脑开机后,要设置密码,设置完成后,重新启动电脑,就会出现密码登录框,输入密码并正确后,电脑才能正常进入系统。1、首先进入安全模式;进入安全模式教程:2、...

小白刷机官网(小白刷机助手)

平板的话,和处理器有关,如果处理器只支持win8是不能刷win10的。

windows关闭端口命令(windows 关端口)

1、点击控制面板。2、进入控制面板,然后点击系统和安全。3、进入系统和安全,点击Windows防火墙。4、进入Windows防火墙,点击左侧的高级设置。5、进入防火墙高级设置,点击入站规则。6、点击入...

360免费wifi老版本(360免费wifi2019下载安装)
  • 360免费wifi老版本(360免费wifi2019下载安装)
  • 360免费wifi老版本(360免费wifi2019下载安装)
  • 360免费wifi老版本(360免费wifi2019下载安装)
  • 360免费wifi老版本(360免费wifi2019下载安装)
无线wifi路由器怎么安装(请问无线路由器怎么安装)

安装的方法/步骤:1、怎么安装无线路由器呢?首先把网线的其中一头插入进光猫里面。2、接着用网线的另一头插入进无线路由器的蓝色接口处,这样就安装好无线路由器啦。3、点击打开电脑浏览器,输入路由器设置地址...

取消回复欢迎 发表评论: