小试YARP

.net core下,一个轻量组反向代理库,由微软发起。

做了一个简单的带验证的反向代理,应用结构如上图,一个验证服务,两个业务服务和一个YARP服务。

源码

https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/YARP

YARP的Starup.cs如下,主要是用来添加YARP组件和添加权限组件部分。

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Extensions.Hosting;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Text;
using System;namespace YARPDemo01
{public class Startup{public IConfiguration Configuration { get; }public Startup(IConfiguration configuration){Configuration = configuration;}public void ConfigureServices(IServiceCollection services){AddAuth(services);services.AddReverseProxy().LoadFromConfig(Configuration.GetSection("ReverseProxy"));}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseAuthentication();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapReverseProxy();});}void AddAuth(IServiceCollection services){//读取配置文件var audienceConfig = Configuration.GetSection("Audience");var symmetricKeyAsBase64 = audienceConfig["Secret"];var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);var signingKey = new SymmetricSecurityKey(keyByteArray);var tokenValidationParameters = new TokenValidationParameters{ValidateIssuerSigningKey = true,IssuerSigningKey = signingKey,ValidateIssuer = true,ValidIssuer = audienceConfig["Issuer"],ValidateAudience = true,ValidAudience = audienceConfig["Audience"],ValidateLifetime = true,ClockSkew = TimeSpan.Zero,RequireExpirationTime = true,};var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);//这个集合模拟用户权限表,可从数据库中查询出来var permission = new List<Permission> {new Permission {  Url="/webapi01/test1", Name="admin"},new Permission {  Url="/webapi01/test3", Name="admin"},new Permission {  Url="/webapi02/test2", Name="admin"},new Permission {  Url="/webapi02/test4", Name="admin"},};//如果第三个参数,是ClaimTypes.Role,上面集合的每个元素的Name为角色名称,如果ClaimTypes.Name,即上面集合的每个元素的Name为用户名var permissionRequirement = new PermissionRequirement("/api/denied", permission,ClaimTypes.Role,audienceConfig["Issuer"],audienceConfig["Audience"],signingCredentials,expiration: TimeSpan.FromSeconds(1000000)//设置Token过期时间);services.AddAuthorization(options =>{options.AddPolicy("Permission", policy => policy.AddRequirements(permissionRequirement));}).AddAuthentication(options =>{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o =>{//不使用httpso.RequireHttpsMetadata = false;o.TokenValidationParameters = tokenValidationParameters;o.Events = new JwtBearerEvents{OnTokenValidated = context =>{if (context.Request.Path.Value.ToString() == "/api/logout"){var token = ((context as TokenValidatedContext).SecurityToken as JwtSecurityToken).RawData;}return Task.CompletedTask;}};});//注入授权Handlerservices.AddSingleton<IAuthorizationHandler, PermissionHandler>();services.AddSingleton(permissionRequirement);}}
}

YARP项目实现API聚合appsettings.json

{"urls": "https://*:6001;http://*:6000","Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","Audience": {"Secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890","Issuer": "gsw","Audience": "everone"},//实现api聚合"ReverseProxy": {"Routes": [//业务服务webapi01{"RouteId": "webapi01","ClusterId": "webapi01_cluster","AuthorizationPolicy": "Permission","Match": {"Path": "/webapi01/{**catch-all}"}},//业务服务webapi02{"RouteId": "webapi02","ClusterId": "webapi02_cluster","AuthorizationPolicy": "Permission","Match": {"Path": "/webapi02/{**catch-all}"}},//验证服务{"RouteId": "authservice","ClusterId": "auth_cluster","Match": {"Path": "/auth/{**catch-all}"}}],"Clusters": {//业务服务webapi01"webapi01_cluster": {"Destinations": {"webapi01_cluster/destination": {"Address": "https://localhost:7001/"}}},//业务服务webapi02"webapi02_cluster": {"Destinations": {"webapi02_cluster/destination": {"Address": "https://localhost:8001/"}}},//验证服务"auth_cluster": {"Destinations": {"auth_cluster/destination": {"Address": "https://localhost:5001/"}}}}}
}

Auth项目实现登录签名部分

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
namespace AuthenticationAuthorization_Token
{public class JwtToken{/// <summary>/// 获取基于JWT的Token/// </summary>/// <param name="username"></param>/// <returns></returns>public static dynamic BuildJwtToken(Claim[] claims, PermissionRequirement permissionRequirement){var now = DateTime.UtcNow;var jwt = new JwtSecurityToken(issuer: permissionRequirement.Issuer,audience: permissionRequirement.Audience,claims: claims,notBefore: now,expires: now.Add(permissionRequirement.Expiration),signingCredentials: permissionRequirement.SigningCredentials);var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);var response = new{Status = true,access_token = encodedJwt,expires_in = permissionRequirement.Expiration.TotalMilliseconds,token_type = "Bearer"};return response;}}
}

看结果:

首先登录获取token,用户名gsw,密码111111

访问webapi01

访问webapi02

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分法——leetcode35. 搜索插入位置

二分法的第一种写法 在左闭右闭的区间寻找target&#xff1b; 不变的量是&#xff1a;[left,right]; #include<bits/stdc.h> using namespace std; int binary_search(vector<int> &nums,int target) {int left 0;int right nums.size() - 1; //定义target…

python大鱼吃小鱼_python 游戏编程 大鱼吃小鱼

# 游戏编程&#xff1a;按照以下游戏编写一个乌龟类和鱼类&#xff0c;并尝试编写游戏。 # 假设游戏场景&#xff08;x&#xff0c;y&#xff09;为0<x<10,0<y<10 # 游戏生成1只乌龟和10只鱼 # 他们的移动方向均随机 # 乌龟的最大移动速度为2&#xff0c;它可以随机…

Entity Framework Core 5中实现批量更新、删除

本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新、删除数据的开发包&#xff0c;并且分析了其实现原理&#xff0c;并且与其他实现方案做了比较。一、背景随着微软全面拥抱开源&#xff0c;.Net开源社区百花开放&#xff0c;涌现了非常多…

篮子里拿鸡蛋问题

一个一个拿&#xff0c;正好拿完。两个两个拿&#xff0c;还剩一个。三个三个拿&#xff0c;正好拿完。 四个四个拿&#xff0c;还剩一个。五个五个拿&#xff0c;还差一个。六个六个拿&#xff0c;还剩三个。 七个七个拿&#xff0c;正好拿完。八个八个拿&#xff0c;还剩一个…

python 复制文件_python 复制文件

展开全部 用Python把某一2113目录下的文件复制到指定5261目录中&#xff0c;代码如下&#xff1a;4102 1、首先插入必要的库&#xff1a;import os import os.path import shutil import time, datetime 2、实现复制文1653件代码如下&#xff1a;def copyFiles(sourceDir,targe…

一套标准的ASP.NET Core容器化应用日志收集分析方案

点击上方蓝字给一个关注吧讲故事关注我公众号的朋友&#xff0c;应该知道我写了一些云原生应用日志收集和分析相关的文章&#xff0c;其中内容大多聚焦某个具体的组件&#xff1a;超级有用的TraceId&#xff0c;快点用起来吧&#xff01;如何利用NLog输出结构化日志&#xff0c…

算法设计与分析——递归与分治策略——棋盘覆盖

问题描述 棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中&#xff0c;你给定任意一个特殊点&#xff0c;用一种方案实现对除该特殊点的棋盘实现全覆盖。 建立模型如图&#xff1a; 解决方案就是利用分治法&#xff0c;将方形棋盘分成4部分&#xff0c;如果该特殊点在某一部…

函数求值需要运行所有线程_JavaScript函数式编程(二)

纯函数就是&#xff0c;对于相同的输入&#xff0c;永远会得到相同的输出&#xff0c;而且没有任何可观察的副作用&#xff0c;也不依赖外部环境的状态但是实际的编程中&#xff0c;特别是前端的编程范畴里&#xff0c;“不依赖外部环境”这个条件是根本不可能的&#xff0c;我…

如何在 C# 中使用 RabbitMQ

译文链接&#xff1a;https://www.infoworld.com/article/3200210/how-to-work-with-rabbitmq-in-c.htmlRabbitMQ 是一个非常流行的&#xff0c;开源的&#xff0c;使用Erlang语言编写的框架&#xff0c;通常在电信级平台中作为消息中间件使用&#xff0c;RabbitMQ实现了高级的…

算法设计与分析——递归与分治——归并排序

归并排序采用的是一种分治的思想&#xff0c;如下图&#xff0c;先将要排序的元素分为两块&#xff0c;每个块又开始分裂&#xff0c;然后逐个按照特定顺序合并&#xff0c;合成最后我们需要的数组。 归并排序的复杂度&#xff1a; 时间复杂度&#xff1a;O(nlogn) 空间复杂度&…

git 回退上一个版本_Git小白使用教程:详细、显现、真正手把手教!

不少小伙伴私信问我GitHub怎么使用&#xff1f;今天更一下&#xff0c;希望能帮到你&#xff0c;有问题评论区拍砖交流吧。

在传统行业做数字化转型之业务篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第307篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是第三部分—业务篇&#xff0c;主要会介绍一下传统企业通用的三大…

算法设计与分析——递归与分治策略——快速排序

快速排序——递归算法 处理i,j的先后顺序不能改变 快速排序的基本思想&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序。 函数…

git pull 覆盖本地_SVN与Git比较的优缺点差异

一、 集中式vs分布式1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器&#xff0c;保存所有文件的修订版本&#xff0c;而协同工作的人们都通过客户端连到这台服务器&#xff0c;取出最新的文件或者提交更新。Subversion的特点概括起…

C#阻塞队列BlockingCollection

BlockingCollection是一个比较冷门的类&#xff0c;我们先看下官方对这个类的定义&#xff1a;简单来说&#xff0c;BlockingCollection就是一个线程安全的阻塞队列&#xff0c;利用阻塞这个特性&#xff0c;我们可以实现进程内的生产者-消费者模式&#xff0c;比如消息转发、日…

算法设计与分析——递归与分治策略——线性时间选择

顾名思义&#xff1a;这篇文章讲解的就是如果用线性时间算法来作出元素选择问题。 问题描述&#xff1a;给定线性序集中n个元素和一个整数k&#xff0c;1<k<n.要求找出这n个元素中第k小的元素&#xff0c;即如果将这个n个元素依其线性序排列时&#xff0c;排在第k个位置的…

如何在 .NET 中使用 Redis缓存

译文链接&#xff1a;https://www.infoworld.com/article/3187905/how-to-work-with-redis-cache-in-net.html缓存是一种状态管理机制&#xff0c;通常用于提升你的应用程序性能&#xff0c;它很大程度上能够减少一个请求对你系统资源的消耗。Redis是一个开源的&#xff0c;高性…

git push被拒绝_规范git项目提交并自动生成项目commit log

commit message 是开发的日常操作, 好的 log 不仅有助于他人 review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是在平时工作时&#xff0c;只依赖大致的开发规范和自觉&#xff0c;很难形成一种普遍约束。而通过本文&#xff0c;对项目进行一些基础配置&…

算法设计与分析——递归与分治策略——全排列

算法设计与分析——递归与分治策略——全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位&#xff0c;如果递归到了最后一位&#xff0c;则输出他当前的全排列序列。 如果没有到达最后一位&#xff0c;则循环的交换该第K个元素与其后面的所有…

asp.net core 集成 prometheus

asp.net core 集成 prometheusIntroPrometheus 是一个开源的现代化&#xff0c;云原生的系统监控框架&#xff0c;并且可以轻松的集成 PushGateway, AlertManager等组件来丰富它的功能。对于 k8s 下部署的系统来说使用 Prometheus 来做系统监控会是一个比较不错的选择&#xff…