目录

Welcome to YARP - 1.认识YARP并搭建反向代理服务

Welcome to YARP - 2.配置功能

Welcome to YARP - 3.负载均衡

Welcome to YARP - 4.限流

Welcome to YARP - 5.身份验证和授权

Welcome to YARP - 6.压缩、缓存

Welcome to YARP - 7.健康检查

Welcome to YARP - 8.分布式跟踪

介绍

说到认证授权,相信还是有很多小伙伴把这两个东西搞混掉,毕竟两个单词也是很相近,AuthenticationAuthorization

  • 身份验证 (我是谁?)是知道用户的标识。 例如,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();

要了解如何设置首选的身份验证类型,可以参阅身份验证文档

特殊值(内置策略):

除了自定义策略名称之外,还可以在路由的授权参数中指定两个特殊值: defaultanonymous 。这是两个内置的策略名称,用于简化身份验证和授权配置。

  • 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.身份验证和授权的更多相关文章

  1. ASP.NET Web API身份验证和授权

    英语原文地址:http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-a ...

  2. ASP.NET MVC5学习系列——身份验证、授权

    一.什么是身份验证和授权 人们有时对用户身份验证和用户授权之间的区别感到疑惑.用户身份验证是指通过某种形式的登录机制(包括用户名/密码.OpenID.OAuth等说明身份的项)来核实用户的身份.授权验 ...

  3. 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分

    原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...

  4. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  5. 使用 cookie 的身份验证和授权

    前言 在上一章 学学 dotnet core 中的身份验证和授权-1-概念 中,我们大致明白了身份验证和授权两者的关系.那么在本文中,我们将使用 cookie 来做一个简单的身份验证和授权. 本文中我 ...

  6. 学学dotnet core中的身份验证和授权-1-概念

    前言 身份验证: Authentication 授权: Authorization net core 中的身份验证和授权这两个部分,是相辅相成的.当初我在学在部分的时候,是看的 net core 官网 ...

  7. RabbitMQ身份验证、授权、访问控制

    原文:https://www.rabbitmq.com/access-control.html 概述 不同的用户只能访问特定的虚拟主机.他们在每个虚拟主机中的权限也可以被限制. RabbitMQ支持两 ...

  8. ASP.NET WEBAPI 的身份验证和授权

    定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...

  9. ASP.NET MVC5(五):身份验证、授权

    使用Authorize特性进行身份验证 通常情况下,应用程序都是要求用户登录系统之后才能访问某些特定的部分.在ASP.NET MVC中,可以通过使用Authorize特性来实现,甚至可以对整个应用程序 ...

  10. mongo的身份验证和授权

    问题来源 刚装好的mongo,准备登陆进去测一把的,结果就给我报这个错,鄙人是新手,还不太清楚这个,现学一下~ Mongo的身份验证 在上一篇安装mongo的博客中(https://www.cnblo ...

随机推荐

  1. MIT 6.5840 Raft Implementation(2B, Log Replication)

    Raft实现思路+细节(2B) 任务分解 2B中最主要的任务就是进行日志的复制.Raft是一个强领导人的系统,这意味着所有的日志添加都是由领导人发起的,与之相类似的,还有很多其他的结论(它们都是比较显 ...

  2. 从module_init看内核模块

    开篇 module_init是linux内核提供的一个宏, 可以用来在编写内核模块时注册一个初始化函数, 当模块被加载的时候, 内核负责执行这个初始化函数. 在编写设备驱动程序时, 使用这个宏看起来理 ...

  3. webpack dev server 与 hot module replace 提高开发效率

    通过 webpack 命令编译源代码时,如果我们对源代码进行了修改,需要重新执行命令才能看到编译后的效果. 这样在开发中非常的影响效率,如果存在一种方式,当文件被修改时,webpack 自动监听重新编 ...

  4. 理解linux的CPU上下文切换

    前言 linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行.当然,这个同时运行不是真的同时运行,而是系统在很短的时间内轮流分配CPU资源,由于CPU的速度很快,所以给人一种同时运行的错 ...

  5. JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践

    前言 自 2014 年发布以来, JDK 8 一直都是相当热门的 JDK 版本.其原因就是对底层数据结构.JVM 性能以及开发体验做了重大升级,得到了开发人员的认可.但距离 JDK 8 发布已经过去了 ...

  6. Redis专题-队列

    Redis专题-队列 首先,想一想 Redis 适合做消息队列吗? 1.消息队列的消息存取需求是什么?redis中的解决方案是什么? 无非就是下面这几点: 0.数据可以顺序读取 1.支持阻塞等待拉取消 ...

  7. 解密Prompt系列13. LLM Agent-指令微调方案: Toolformer & Gorilla

    上一章我们介绍了基于Prompt范式的工具调用方案,这一章介绍基于模型微调,支持任意多工具组合调用,复杂调用的方案.多工具调用核心需要解决3个问题,在哪个位置进行工具调用(where), 从众多工具中 ...

  8. Web开发框架 WebBuilder 9 发布

    WebBuilder 是一款强大,全面和高效的Web开发框架 .基于浏览器的集成开发环境,智能化的设计,能轻松完成常规桌面应用和面向手机等的移动应用开发.高效.稳定和可扩展的特点,适合复杂企业级应用的 ...

  9. torch.nn基础学习教程 | PyTorch nn Basic Tutorial

    基于torch.nn搭建神经网络的基础教程大纲: 1. 引言 在我们开始深入探讨torch.nn之前,我们首先需要理解PyTorch及其神经网络库的基础知识.这一部分的内容将帮助你对PyTorch有一 ...

  10. 《CTFshow-Web入门》07. Web 61~70

    @ 目录 web61~65 题解 web66 题解 原理 web67 题解 原理 web68 题解 原理 web69 题解 原理 web70 题解 原理 ctf - web入门 web61~65 题解 ...