你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何将 Azure SignalR 服务与 Azure 应用程序网关配合使用

应用程序网关是一种 Web 流量负载均衡器,可用于管理 Web 应用程序的流量。 将应用程序网关与 SignalR 服务配合使用可以执行以下操作:

  • 保护应用程序免受常见的 Web 漏洞影响。
  • 为可缩放且高度可用的应用程序获取应用程序级负载均衡。
  • 设置端到端安全性。
  • 自定义域名。

本文包含两个部分:

  • 第一部分演示如何配置应用程序网关,以便客户端可以通过应用程序网关访问 SignalR。
  • 第二部分演示如何通过向 SignalR 服务添加访问控制来保护 SignalR 服务,仅允许来自应用程序网关的流量。

此图显示将 SignalR 服务与应用程序网关配合使用的体系结构。

设置和配置应用程序网关

创建 SignalR 服务实例

  • 按照此文操作,创建 SignalR 服务实例 ASRS1

创建应用程序网关实例

从门户创建应用程序网关实例 AG1:

  • Azure 门户上,搜索“应用程序网关”和“创建”。

  • 在“基本信息”选项卡上,使用这些值作为以下应用程序网关设置:

    • “订阅”、“资源组”和“区域”:与为 SignalR 服务选择的相同

    • 应用程序网关名称:AG1

    • 虚拟网络:选择“新建”,然后在打开的“创建虚拟网络”窗口中输入以下值来创建虚拟网络和两个子网,一个子网用于应用程序网关,另一个子网用于后端服务器。

      • 名称:输入 VN1 作为虚拟网络的名称。

      • 子网:使用以下 2 个子网更新“子网”网格

        子网名称 地址范围 备注
        myAGSubnet (地址范围) 应用程序网关的子网。 应用程序网关子网只能包含应用程序网关。 不允许其他资源。
        myBackendSubnet (另一个地址范围) Azure SignalR 实例的子网。
    • 接受其他设置的默认值,然后选择“下一步: 前端”

    屏幕截图显示如何使用“基本信息”选项卡创建应用程序网关实例。

  • 在“前端”选项卡上:

    • 前端 IP 地址类型:公共。
    • 为“公共 IP 地址”选择“新增”,输入“myAGPublicIPAddress”作为公共 IP 地址名称,然后选择“确定” 。
    • 选择“下一步: 后端”屏幕截图显示如何使用“前端”选项卡创建应用程序网关实例。
  • 在“后端”选项卡上,选择“添加后端池”:

    • 名称:输入 signalr 作为 SignalR 服务资源后端池。
    • 后端“目标”:SignalR 服务实例 ASRS1 的主机名,例如 asrs1.service.signalr.net
    • 选择“下一步: 配置”

    屏幕截图显示如何为 SignalR 服务设置应用程序网关后端池。

  • 在“配置”选项卡上,选择“路由规则”列中的“添加路由规则”:

    • 规则名称:myRoutingRule

    • 优先级:1

    • 在“添加传递规则”窗口中的“侦听器”选项卡上,输入侦听器的以下值 :

      • 侦听器名称:输入“myListener”作为侦听器名称。
      • 前端 IP:选择“公共”,以选择为前端创建的公共 IP 。
      • 协议:HTTP
        • 在本文中,我们在应用程序网关上使用 HTTP 前端协议来简化演示,帮助你更轻松地入门。 但实际上,可能需要在生产方案中在其上启用 HTTPS 和客户域。
      • 接受“侦听器”选项卡上其他设置的默认值 为 SignalR 服务设置应用程序网关传递规则的“侦听器”选项卡的屏幕截图。
    • 在“后端目标”选项卡上,使用以下值:

      • 目标类型:后端池

      • 后端目标:选择之前创建的 signalr

      • 后端设置:选择“添加新项”以添加新设置。

        • 后端设置名称:mySetting
        • 后端协议:HTTPS
        • 使用已知的 CA 证书:是
        • 替代为新的主机名:是
        • 主机名替代:从后端目标选取主机名
        • 其他项保留默认值

        屏幕截图显示如何为 SignalR 服务设置应用程序网关后端设置。

      屏幕截图显示如何为应用程序网关创建后端目标。

  • 查看并创建 AG1

配置应用程序网关运行状况探测

创建 AG1 后,转到门户中“设置”部分下的“运行状况探测”选项卡,将运行状况探测路径更改为 /api/health

屏幕截图显示如何为 SignalR 服务设置应用程序网关后端运行状况探测。

快速测试

  • 使用无效的客户端请求 https://asrs1.service.signalr.net/client 进行尝试,它返回 400 和错误消息“需要 'hub' 查询参数”。这意味着请求到达了 SignalR 服务并进行了请求验证。

    curl -v https://asrs1.service.signalr.net/client
    

    返回

    < HTTP/1.1 400 Bad Request
    < ...
    <
    'hub' query parameter is required.
    
  • 转到 AG1 的“概述”选项卡,找到前端公共 IP 地址

    屏幕截图显示如何通过应用程序网关快速测试 SignalR 服务运行状况终结点。

  • 通过 AG1http://<frontend-public-IP-address>/client 访问运行状况终结点,它也返回 400 和错误消息“需要 'hub' 查询参数”。这意味着请求已成功通过应用程序网关到达 SignalR 服务并进行请求验证。

    curl -I http://<frontend-public-IP-address>/client
    

    返回

    < HTTP/1.1 400 Bad Request
    < ...
    <
    'hub' query parameter is required.
    

通过应用程序网关运行聊天

现在,流量可以通过应用程序网关到达 SignalR 服务。 客户可以使用应用程序网关公共 IP 地址或自定义域名来访问资源。 让我们将此聊天应用程序用作示例。 让我们一开始在本地运行它。

  • 首先,让我们获取 ASRS1 的连接字符串

    • 在 ASRS1 的“连接字符串”选项卡上
      • 客户端终结点:使用 AG1 的前端公共 IP 地址输入 URL,例如 http://20.88.8.8。 它是一个连接字符串生成器(使用反向代理时)。当你下次返回到此选项卡时,该值不会保留。输入值后,连接字符串会追加一个 ClientEndpoint 部分。
      • 复制连接字符串 获取 SignalR 服务与客户端终结点的连接字符串的屏幕截图。
  • 克隆 GitHub 存储库 https://github.com/aspnet/AzureSignalR-samples

  • 转到 samples/Chatroom 文件夹:

  • 设置复制的连接字符串并在本地运行应用程序,可以看到 ConnectionString 中有一个 ClientEndpoint 部分。

    cd samples/Chatroom
    dotnet restore
    dotnet user-secrets set Azure:SignalR:ConnectionString "<copied-onnection-string-with-client-endpoint>"
    dotnet run
    
  • 从浏览器打开 http://localhost:5000 并使用 F12 查看网络跟踪,可以看到 WebSocket 连接是通过 AG1 建立的

    屏幕截图显示如何通过应用网关和 SignalR 服务在本地运行聊天应用程序。

保护 SignalR 服务

在上一部分,我们已成功将 SignalR 服务配置为应用程序网关的后端服务。我们可以直接通过公用网络或应用程序网关调用 SignalR 服务。

在本部分,让我们将 SignalR 服务配置为拒绝来自公用网络的所有流量,仅接受来自应用程序网关的流量。

配置 SignalR 服务

让我们将 SignalR 服务配置为仅允许专用访问。 可以在为 SignalR 服务使用专用终结点中找到更多详细信息。

  • 转到门户中的 SignalR 服务实例 ASRS1。

  • 转到“网络”选项卡:

    • 在“公共访问”选项卡上:“公用网络访问”更改为“已禁用”和“保存”,现在你再也不能从公用网络访问 SignalR 服务

      屏幕截图显示如何为 SignalR 服务禁用公共访问。

    • 在“专用访问”选项卡上,选择“+ 专用终结点”:

      • 在“基本信息”选项卡上:
        • 名称:PE1
        • 网络接口名称:PE1-nic
        • 区域:确保选择与应用程序网关相同的区域
        • 选择“下一步: 资源”
      • 在“资源”选项卡上
        • 保留默认值
        • 选择“下一步: 虚拟网络”
      • 在“虚拟网络”选项卡上
        • 虚拟网络:选择以前创建的 VN1
        • 子网:选择以前创建的 VN1/myBackendSubnet
        • 其他项保留默认设置
        • 选择“下一步: DNS”
      • 在“DNS”选项卡上
        • 与专用 DNS 区域集成:是
      • 查看并创建专用终结点

    屏幕截图显示如何为 SignalR 服务设置专用终结点资源。

刷新应用程序网关后端池

由于应用程序网关是在有专用终结点供其使用之前设置的,因此我们需要刷新后端池,以便它查看专用 DNS 区域,确定应将流量路由到专用终结点而不是公共地址。 我们进行刷新的方式是将后端 FQDN 设置为其他值,然后将其更改回来。

转到 AG1“后端池”选项卡,然后选择“signalr”:

  • 步骤 1:将目标 asrs1.service.signalr.net 更改为其他值(例如 x.service.signalr.net),然后选择“保存”
  • 步骤 2:将目标改回 asrs1.service.signalr.net

快速测试

  • 现在让我们再次访问 https://asrs1.service.signalr.net/client。 禁用公共访问后,它会改为返回 403。

    curl -v https://asrs1.service.signalr.net/client
    

    返回

    < HTTP/1.1 403 Forbidden
    
  • 通过 AG1http://<frontend-public-IP-address>/client 访问终结点,它会返回 400 和错误消息“需要 'hub' 查询参数”。 这意味着请求已成功通过应用程序网关到达 SignalR 服务。

    curl -I http://<frontend-public-IP-address>/client
    

    返回

    < HTTP/1.1 400 Bad Request
    < ...
    <
    'hub' query parameter is required.
    

现在,如果再次在本地运行聊天应用程序,则会看到错误消息“Failed to connect to .... The server returned status code '403' when status code '101' was expected.”,这是因为已禁用公共访问,因此 localhost 服务器连接再也不能连接到 SignalR 服务。

让我们使用 ASRS1 将聊天应用程序部署到同一 VNet 中,使聊天应用程序可以与 ASRS1 通信。

将聊天应用程序部署到 Azure

  • Azure 门户上,搜索“应用服务”和“创建 Web 应用”。

  • 在“基本信息”选项卡上,将这些值用于以下 Web 应用设置

    • “订阅”、“资源组”和“区域”:与为 SignalR 服务选择的相同
    • 名称:WA1
    • 发布:代码
    • 运行时堆栈:.NET 6 (LTS)
    • 操作系统:Linux
    • 区域:确保它与为 SignalR 服务选择的区域相同
    • 选择“下一步: 部署”,保留所有默认值,然后选择“下一步: 网络”
  • 在“网络”选项卡上:

    • 启用网络注入:选择“打开”
    • 虚拟网络:选择以前创建的 VN1
    • 启用 VNet 集成:打开
    • 出站子网:创建新子网
    • 选择“查看 + 创建”

现在,让我们将聊天应用程序部署到 Azure。 Below

我们使用 Azure CLI 将聊天应用程序部署到 Azure。 查看快速入门:部署 ASP.NET Web 应用,了解部署到 Azure 的其他部署环境。

在 samples/Chatroom 文件夹下,运行以下命令:

# Build and publish the assemblies to publish folder
dotnet publish --os linux -o publish
# zip the publish folder as app.zip
cd publish
zip -r app.zip .
# use az CLI to deploy app.zip to our webapp
az login
az account set -s <your-subscription-name-used-to-create-WA1>
az webapp deploy -g <resource-group-of-WA1> -n WA1 --src-path app.zip

现在已部署 Web 应用,接下来我们转到 WA1 门户,进行以下更新:

  • 在“配置”选项卡上:

    • 新应用程序设置:

      名称
      WEBSITE_DNS_SERVER 168.63.129.16
      WEBSITE_VNET_ROUTE_ALL 1
    • 新连接字符串:

      “属性” 类型
      AzureSignalRConnectionString 使用 ClientEndpoint 值的已复制连接字符串 选择“自定义”

    屏幕截图显示如何配置 Web 应用连接字符串。

  • 在“TLS/SSL 设置”选项卡上:

    • 仅 HTTPS:关闭。 为了简化演示,我们在应用程序网关上使用了 HTTP 前端协议。 因此,我们需要关闭此选项,以免自动将 HTTP URL 更改为 HTTPS URL。
  • 转到“概述”选项卡,获取 WA1 的 URL。

  • 获取 URL,将方案 https 替换为 http(例如 http://wa1.azurewebsites.net),在浏览器中打开 URL,现在可以开始聊天了! 使用 F12 打开网络跟踪,可以看到 SignalR 连接是通过 AG1 建立的。

    备注

    有时,需要禁用浏览器的自动 https 重定向和浏览器缓存功能,以防止 URL 自动重定向到 HTTPS。

    屏幕截图显示如何通过应用网关和 SignalR 服务在 Azure 中运行聊天应用程序。

后续步骤

现在,你已成功使用 SignalR 服务构建实时聊天应用程序,且已使用应用程序网关来保护应用程序并设置端到端安全性。 详细了解 SignalR 服务