YARP 身份验证和授权

介绍

反向代理可用于在将请求代理到目标服务器之前进行身份验证和授权。 这可以减少目标服务器上的负载,添加一层保护,并确保跨应用程序实施一致的策略。

默认值

除非在路由或应用程序配置中启用,否则不会对请求执行身份验证或授权。

配置

可以通过 RouteConfig.AuthorizationPolicy 为每个路由单独指定授权策略,并可以从配置文件的某节中绑定。 与其他路由属性一样,无需重启代理即可修改和重新加载此属性。 策略名称不区分大小写。

示例:

{
  "ReverseProxy": {
    "Routes": {
      "route1" : {
        "ClusterId": "cluster1",
        "AuthorizationPolicy": "customPolicy",
        "Match": {
          "Hosts": [ "localhost" ]
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "cluster1/destination1": {
            "Address": "https://localhost:10001/"
          }
        }
      }
    }
  }
}

授权策略 是代理利用的 ASP.NET 核心概念。 代理提供上述配置来指定每个路由的策略,其余配置由现有 ASP.NET 核心身份验证和授权组件处理。

可以在应用程序中配置授权策略,如下所示:

services.AddAuthorization(options =>
{
    options.AddPolicy("customPolicy", policy =>
        policy.RequireAuthenticatedUser());
});

在Program.cs添加授权和身份验证中间件。

app.UseAuthentication();
app.UseAuthorization();

app.MapReverseProxy();

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

特殊值:

除了自定义策略名称,还可以在路由的授权参数中指定两个特殊值: defaultanonymous。 ASP.NET Core 还具有适用于未指定策略的路由的 FallbackPolicy 设置。

默认策略

在路由的授权参数中指定值 default 意味着路由将使用 AuthorizationOptions.DefaultPolicy 中定义的策略。 该策略已预先配置为要求经过身份验证的用户。

匿名

在路由的授权参数中指定值 anonymous 意味着,无论应用程序中的任何其他配置(如 FallbackPolicy)中的任何其他配置,路由都不需要授权。

FallbackPolicy

AuthorizationOptions.FallbackPolicy 是应用于所有未配置策略的请求或路由的默认策略。 默认情况下,FallbackPolicy 没有值,将允许任何请求。

传播凭据

即使在代理中授权请求后,目标服务器可能仍需要知道用户是谁(身份验证),以及允许他们执行哪些作(授权)。 信息流的方式取决于所使用的身份验证类型。

这些身份验证类型已在请求标头中传递其值,这些类型默认将流向目标服务器。 该服务器仍需要验证和解释这些值,从而导致一些双重工作。

OAuth2、OpenIdConnect、WsFederation

这些协议通常用于远程标识提供者。 身份验证过程可以在代理应用程序中配置,并将导致身份验证 cookie。 cookie 将作为普通请求标头流向目标服务器。

Windows、Negotiate、NTLM、Kerberos

这些身份验证类型通常绑定到特定连接。 不支持它们作为在 YARP 代理后面的目标服务器中对用户进行身份验证的方法(请参阅 #166。 它们可用于对代理的传入请求进行身份验证,但该标识信息必须以另一种形式传递给目标服务器。 它们还可用于向目标服务器验证代理,但仅作为代理自己的用户,不支持模拟客户端。

客户端证书

客户端证书是一项 TLS 功能,并且在连接过程中协商。 有关其他信息 ,请参阅这些文档 。 可以使用 ClientCert 转换将证书作为 HTTP 标头转发到目标服务器。

交换身份验证类型

像 Windows 这样不能自然流向目标服务器的身份验证类型将需要在代理中转换为替代形式。 例如,可以使用用户信息创建 JWT 持有者令牌,并在代理请求上设置。

可以使用 自定义请求转换执行这些交换。 如果社区感兴趣,则可以针对特定方案开发详细示例。 我们需要更多来自社区的反馈,了解您希望如何进行标识信息的转换和流转。