Welcome to YARP - 5.身份验证和授权
目录
Welcome to YARP - 1.认识YARP并搭建反向代理服务
- 2.1 - 配置文件(Configuration Files)
- 2.2 - 配置提供者(Configuration Providers)
- 2.3 - 配置过滤器(Configuration Filters)
Welcome to YARP - 6.压缩、缓存
Welcome to YARP - 7.健康检查
Welcome to YARP - 8.分布式跟踪
介绍
说到认证和授权,相信还是有很多小伙伴把这两个东西搞混掉,毕竟两个单词也是很相近,Authentication 和 Authorization。
身份验证 (我是谁?)是知道用户的标识。 例如,Alice 使用她的用户名和密码登录,服务器使用该密码对 Alice 进行身份验证。
对于认证的结果会存储在
HttpContext.User
中。常见的认证方式有:Cookie、JWT、Windows、等等,可参考 ASP.NET Core 身份验证概述授权 (我有什么权限?)决定是否允许用户执行操作。 例如,Alice 有权获取资源,但无权创建资源。
授权与身份验证相互独立。 但是,授权需要一种身份验证机制。常见的授权策略有:基于角色的 RBAC,基于策略的PBAC等等,可参考 ASP.NET Core 授权简介
有了上述了解,接下来我们看 YARP
的 身份验证 和 授权
反向代理可用于在将请求代理到目标服务器之前,对请求进行身份验证和授权。这可以减少目标服务器上的负载,增加一层保护,并确保在应用程序中实施一致的策略。 接下来让我们看下如何开启认证和授权。
如果有对 .NET 本身的身份验证和授权功能不了解的小伙伴,可以先去微软文档了解一下(身份验证、授权),再回来看可能会容易理解。因为 YARP 就是使用的 .NET 的认证和授权。提供策略,交给其中间件处理。
配置
可以通过 RouteConfig.AuthorizationPolicy 为每个路由指定授权策略,并且可以从配置文件的 Routes
各个部分进行绑定。与其他路由属性一样,可以在不重新启动代理的情况下修改和重新加载此属性。策略名称不区分大小写。
示例:
{
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"AuthorizationPolicy": "customPolicy",
"Match": {
"Hosts": [ "localhost" ]
},
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "https://localhost:10001/"
}
}
}
}
}
}
授权策略使用的是 ASP.NET Core 的概念。代理提供上述配置来为每个路由指定一个策略,其余部分由现有的 ASP.NET Core 身份验证和授权组件处理。 是不是和上一章的限流是一个套路,都是 .NET
本身的功能,开箱即用。
配置授权策略,如下所示:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("customPolicy", policy => policy.RequireAuthenticatedUser());
});
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapReverseProxy();
要了解如何设置首选的身份验证类型,可以参阅身份验证文档
特殊值(内置策略):
除了自定义策略名称之外,还可以在路由的授权参数中指定两个特殊值: default
和 anonymous
。这是两个内置的策略名称,用于简化身份验证和授权配置。
- default 对应于用户已经通过身份验证的情况。如果用户已经登录,那么他们将满足
default
策略的要求。这通常用于需要用户已登录的资源或操作。 在路由的授权参数中指定值default
意味着路由将使用 AuthorizationOptions.DefaultPolicy 中定义的策略。该策略已预先配置为要求经过身份验证的用户。
示例用法:
app.MapGet("/default", () =>
{
return "hello";
}).RequireAuthorization();// 将具有指定名称的授权策略添加到终结点。空 代表使用 default 策略
上述的RequireAuthorization()
方法没给参数 默认就是用了 default
策略,已登录的用户才能通过验证。 而且还可以指定多个策略。他接收的是一个 params string[] policyNames
参数,你还可以添加其他策略。
YARP
中用法:
"Routes": {
"DefaultAuthRoute": {
"ClusterId": "cluster1",
// 此路由使用内置的默认授权策略,该策略要求经过身份验证的用户
"AuthorizationPolicy": "Default",
"Match": {
"Path": "/default"
}
}
}
- anonymous 对应于未经身份验证的用户,即匿名用户。如果用户没有登录,他们将满足
anonymous
策略的要求。这通常用于允许未经身份验证的用户访问资源或操作。 在路由的 authorization 参数中指定值anonymous
意味着无论应用程序中的任何其他配置(如 FallbackPolicy)如何,路由都不需要授权。
示例用法:
app.MapGet("/public", () =>
{
return "hello";
}).AllowAnonymous();
YARP 中用法:
"Routes": {
"AnonymousRoute": {
"ClusterId": "cluster1",
// 此路由使用内置的默认授权策略,该策略要求经过身份验证的用户
"AuthorizationPolicy": "Anonymous",
"Match": {
"Path": "/open/{*any}"
}
}
}
FallbackPolicy 回退策略
AuthorizationOptions.FallbackPolicy 用于处理未指定任何特定策略的路由。这是一个全局默认策略,如果路由没有指定特定策略,就会使用这个策略。通常情况下,FallbackPolicy
会采用默认策略,要求用户已通过身份验证。
示例用法:
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser() // 默认情况下,要求用户已通过身份验证. 可以提成你需要的验证
.Build();
});
YARP 中用法:
"Routes": {
"Other": {
// 由于以下路由未定义授权策略,因此使用回退策略
"ClusterId": "cluster1",
"Match": {
"Path": "{**catchall}"
}
}
}
Flowing Credentials 流动凭证
即使在代理中授权了请求后,目标服务器可能仍需要知道用户是谁(身份验证)以及允许他们执行的操作(授权)。如何传递该信息将取决于所使用的身份验证类型。
Cookie, bearer, API keys
这些身份验证类型已经在请求头中传递了它们的值,默认情况下这些值将流到目标服务器。该服务器仍然需要验证和解释这些值,这可能会造成一些双重工作(代理也校验,目标服务也校验)
Windows, Negotiate, NTLM, Kerbereos
这些身份验证类型通常绑定到特定连接。不支持将它们作为在 YARP
代理后面的目标服务器中对用户进行身份验证的方法(参见 #166。它们可用于对代理的传入请求进行身份验证,但该身份信息必须以另一种形式传达给目标服务器。它们还可用于向目标服务器验证代理,但只能作为代理自己的用户,不支持模拟客户端( YARP
无法代表客户端进行目标服务器的身份验证)
Client Certificates 客户端证书
客户端证书是一项 TLS 功能,作为连接的一部分进行协商。有关其他信息,请参阅这些文档。可以使用 ClientCert 转换将证书作为 HTTP 标头转发到目标服务器。
替换身份验证类型
像 Windows
这样不自然流到目标服务器的身份验证类型需要在代理中转换为其他形式。例如,可以使用用户信息创建 JWT
承载令牌,并在代理请求上进行设置。
可以使用自定义请求转换来执行这些交换(看起来又要加一章 请求转换 的篇章了 )。如果你有足够的兴趣,可以针对特定场景开发详细示例,反馈给 YARP
让他们了解您希望如何转换和流动身份信息的。
总结
本章我们介绍了 YARP
的认证和授权功能,概念比较多,此功能还是主要依赖于.NET 本身的认证和授权。如果有不了的可以先从微软文档学起,看起来相对会简单一些。本章建议结合示例代码一起看理解起来会比较方便,示例代码已上传GitHub
本章示例完整配置如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"DefaultAuthRoute": {
"ClusterId": "cluster1",
// 此路由使用内置的默认授权策略,该策略要求经过身份验证的用户
"AuthorizationPolicy": "Default",
"Match": {
"Path": "/default"
}
},
"ClaimsAuthRoute": {
"ClusterId": "cluster1",
// 自定义策略
"AuthorizationPolicy": "myPolicy",
"Match": {
"Path": "/custom/{*any}"
}
},
"AnonymousRoute": {
"ClusterId": "cluster1",
// 此路由使用内置的默认授权策略,该策略要求经过身份验证的用户
"AuthorizationPolicy": "Anonymous",
"Match": {
"Path": "/open/{*any}"
}
},
"Other": {
// 由于以下路由未定义授权策略,因此使用回退策略
// 程序中 设置为null,因此不需要身份验证或声明。
"ClusterId": "cluster1",
"Match": {
"Path": "{**catchall}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "https://www.baidu.com/"
}
}
}
}
}
}
下篇文章我们继续 压缩 和 缓存 或者再补一篇 请求和响应转换。
Welcome to YARP - 5.身份验证和授权的更多相关文章
- ASP.NET Web API身份验证和授权
英语原文地址:http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-a ...
- ASP.NET MVC5学习系列——身份验证、授权
一.什么是身份验证和授权 人们有时对用户身份验证和用户授权之间的区别感到疑惑.用户身份验证是指通过某种形式的登录机制(包括用户名/密码.OpenID.OAuth等说明身份的项)来核实用户的身份.授权验 ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...
- 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权
OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...
- 使用 cookie 的身份验证和授权
前言 在上一章 学学 dotnet core 中的身份验证和授权-1-概念 中,我们大致明白了身份验证和授权两者的关系.那么在本文中,我们将使用 cookie 来做一个简单的身份验证和授权. 本文中我 ...
- 学学dotnet core中的身份验证和授权-1-概念
前言 身份验证: Authentication 授权: Authorization net core 中的身份验证和授权这两个部分,是相辅相成的.当初我在学在部分的时候,是看的 net core 官网 ...
- RabbitMQ身份验证、授权、访问控制
原文:https://www.rabbitmq.com/access-control.html 概述 不同的用户只能访问特定的虚拟主机.他们在每个虚拟主机中的权限也可以被限制. RabbitMQ支持两 ...
- ASP.NET WEBAPI 的身份验证和授权
定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...
- ASP.NET MVC5(五):身份验证、授权
使用Authorize特性进行身份验证 通常情况下,应用程序都是要求用户登录系统之后才能访问某些特定的部分.在ASP.NET MVC中,可以通过使用Authorize特性来实现,甚至可以对整个应用程序 ...
- mongo的身份验证和授权
问题来源 刚装好的mongo,准备登陆进去测一把的,结果就给我报这个错,鄙人是新手,还不太清楚这个,现学一下~ Mongo的身份验证 在上一篇安装mongo的博客中(https://www.cnblo ...
随机推荐
- js闭包的一些笔记
闭包 闭包是一个可以访问外部作用域的内部函数,即使这个外部作用域已经执行结束 作用域 作用域决定这个变量的生命周期及其可见性.当我们创建一个函数,就会生成一个新的作用域. 通过var创建的变量只有函数 ...
- PyQt5调用主窗口
import sysfrom ui.MainWindow import Ui_Form from PyQt5.QtWidgets import QApplication, QMainWindowcla ...
- 【go笔记】使用sqlx操作MySQL
前言 go在操作MySQL时,可以使用ORM(比如gorm.xorm),也可以使用原生sql.本文以使用sqlx为例,简单记录步骤. go version: 1.16 安装相关库 # mysql驱动 ...
- 应用性能监控工具(pinpoint)部署
Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控.方法执行详情查看.应用状态信息监控等功能.pinpoint使用HBASE储存数据. 下面介绍pinpoint部署及应用. 1. 安装 ...
- __wakeup()魔术方法绕过(CVE-2016-7124)
__wakeup()魔术方法绕过(CVE-2016-7124) 漏洞简介 在php反序列化数据过程中,如果类中存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方 ...
- C#利用Refit实现JWT自动续期
前言 笔者之前开发过一套C/S架构的桌面应用,采用了JWT作为用户的登录认证和授权.遇到的唯一问题就是JWT过期了该怎么办?设想当一个用户正在进行业务操作,突然因为Token过期失效,莫名其妙地跳转到 ...
- KVM下windows由IDE模式改为virtio模式蓝屏 开不开机
KVM安装Windows默认使用的是qemu虚拟化IDE硬盘模式,在这种情况下,IO性能比较低,如果使用virtio的方式可以提高虚拟机IO性能. 于是我想将这台虚拟机迁移到openstack中管理 ...
- 物理服务器不重启分配raid
一.MegaCli 命令的安装及使用 目录 一.MegaCli 命令的安装及使用 1.下载rpm包 2.安装 3.安装完,就会在/opt/下创建个MegaRAID目录,文件都在里面 4.添加软连接 5 ...
- 推荐一个react上拉加载更多插件:react-infinite-scroller
在开发网页和移动应用时,经常需要处理大量数据的展示和加载.如果数据量非常大,一次性全部加载可能会导致页面卡顿或崩溃.为了解决这个问题,我们可以使用无限滚动(Infinite Scroll)的技术.Re ...
- xxl-job初学转载,不断更新
参考:https://blog.csdn.net/xhmico/article/details/122324950 官网与源码下载地址 官网:https://www.xuxueli.com/xxl-j ...