Leer en inglés

Compartir a través de

Azure SignalR 服务的应用程序防火墙

应用程序防火墙提供对分布式系统中客户端连接的复杂控制。 在深入了解其功能和设置之前,让我们阐明应用程序防火墙不执行的操作:

  1. 它不会替换身份验证。 防火墙在客户端连接身份验证层后面运行。
  2. 它与网络层访问控制无关。

应用程序防火墙的作用是什么?

应用程序防火墙由各种规则列表组成。 目前,有两个规则列表称为 “客户端连接计数规则 ”和 “客户端流量控制规则 ”,以及配置 “最大客户端生存期”。 未来的更新将支持更多规则列表来控制连接生存期等方面。

此准则分为三个部分:

  1. 不同应用程序防火墙规则简介。
  2. 使用门户或 Bicep 在 SignalR 服务端配置规则的说明。
  3. 在服务器端配置令牌的步骤。

Prerequisites

客户端连接计数规则

客户端连接计数规则限制并发客户端连接。 当客户端尝试建立新连接时,会按顺序检查规则。 如果违反任何规则,则连接将被拒绝,状态代码为 429。

ThrottleByUserIdRule

此规则限制用户的并发连接数。 例如,如果用户使用不同的设备打开多个浏览器选项卡或登录,则可以使用此规则来限制该用户的并发连接数。

Nota

  • UserId 必须存在于访问令牌中,此规则才有效。 请参阅配置访问令牌

ThrottleByJwtSignatureRule

此规则限制同一令牌的并发连接数,以防止恶意用户重用令牌来建立无限连接,这可能会耗尽连接配额。

Nota

  • 默认情况下,不能保证 SDK 生成的令牌每次都不同。 尽管每个令牌都包含时间戳,但如果在数秒内生成大量令牌,则此时间戳可能相同。 为了避免相同令牌,请将一个随机声明插入到令牌声明中。 请参阅配置访问令牌

ThrottleByJwtCustomClaimRule

更高级的功能是可以根据自定义要求将联系分组到不同的组中。 系统将对具有相同声明的连接进行汇总,以执行该检查。 例如,可以添加 ThrottleByJwtCustomClaimRule,以允许具有自定义声明名称 freeUser 的 5 个并发连接。

Nota

  • 该规则适用于具有特定声明名称的所有声明。 连接计数汇总与同一声明相关联(包括声明名称和声明值)。 ThrottleByUserIdRule 是这个规则的一个特例,适用于包含 userIdentity 声明的所有连接。

Advertencia

  • 避免将 maxCount 设置得过于激进。 客户端连接可能会在不完成 TCP 握手的情况下关闭。 SignalR 服务无法立即检测到这些“半关闭”连接。 在出现检测信号故障之前,连接一直处于活动状态。 因此,激进的限制策略可能会意外地限制客户端。 更稳妥的方法是为连接计数留一定的缓冲余量,例如:将 maxCount 加倍

客户端流量控制规则

客户端流量控制规则限制客户端连接的入站吞吐量。 当客户端尝试发送消息时,系统会按顺序检查这些规则。 在每个聚合窗口中,将聚合消息大小,以针对最大入站消息进行检查。 如果违反任何规则,连接就会断开。

TrafficThrottleByUserIdRule

此规则限制用户的入站吞吐量。

TrafficThrottleByJwtSignatureRule

此规则限制每个令牌的入站吞吐量。

TrafficThrottleByJwtCustomClaimRule

此规则限制同一声明的入站吞吐量。

最大客户端生存期配置

此设置控制客户端连接的最大生存期(以秒为单位)。 当客户端连接生存期达到指定时间时,服务将自动清理会话并关闭连接。 若要禁用此限制,请将值设置为 0。

设置应用程序防火墙

若要使用应用程序防火墙,请导航到 Azure 门户上的 SignalR“应用程序防火墙”边栏选项卡,然后单击“添加”以添加规则。

有关在门户中为 Azure SignalR 添加应用程序防火墙规则的屏幕截图。

配置访问令牌

仅当访问令牌包含相应的声明时,应用程序防火墙规则才会生效。 如果该连接没有相应的声明,则规则会被跳过。

下面是一个在默认模式下在访问令牌中添加 userId 或自定义声明的示例:

services.AddSignalR().AddAzureSignalR(options =>
    {
        //  Add necessary claims according to your rules.
        options.ClaimsProvider = context => new[]
        {
            // Add UserId: Used in ThrottleByUserIdRule
            new Claim(ClaimTypes.NameIdentifier, context.Request.Query["username"]),

            // Add unique claim: Ensure uniqueness when using ThrottleByJwtSignatureRule. 
            // The token name is not important. You could change it as you like.
            new Claim("uniqueToken", Guid.NewGuid().ToString()),
           
            // Custom claim: Used in ThrottleByJwtCustomClaimRule
            new Claim("<Custom Claim Name>", "<Custom Claim Value>"),
            // Custom claim example
            new Claim("freeUser", context.Request.Query["username"]),
        };
    });

无服务器模式的逻辑与此类似。

有关详细信息,请参阅客户协商