共用方式為


如何搭配 Azure 應用程式閘道使用 Azure SignalR Service

應用程式閘道是網路流量負載平衡器,可讓您管理 Web 應用程式的流量。 搭配 SignalR Service 使用應用程式閘道可讓您執行下列動作:

  • 保護您的應用程式免受常見 Web 漏洞的侵害。
  • 取得可調整和高可用性應用程式的應用程式層級負載平衡。
  • 設定端對端安全性。
  • 自訂網域名稱。

本文包含兩個部分:

  • 第一個部分示範如何設定應用程式閘道,讓用戶端可以透過應用程式閘道來存取 SignalR。
  • 第二個部分示範如何將存取控制新增至SignalR Service,並只允許來自應用程式閘道的流量,以保護 SignalR Service。

此圖顯示搭配 應用程式閘道 使用 SignalR Service 的架構。

原始 連接字串 只會出現在本文中,以供示範之用。 在生產環境中,請一律保護您的存取金鑰。 使用 Azure 金鑰保存庫,使用 Microsoft Entra 識別碼安全地管理和輪替密鑰,並保護您的 連接字串,並使用 Microsoft Entra ID 授權存取權。

設定和配置應用程式閘道

建立 SignalR Service 執行個體

  • 遵循本文章並建立 SignalR Service 執行個體 ASRS1

建立應用程式閘道執行個體

從入口網站中建立應用程式閘道執行個體 AG1

  • 在 [Azure 入口網站] 上,搜尋 [應用程式閘道] 和 [建立]。

  • 在 [基本] 索引標籤上,為下列應用程式閘道設定輸入這些值:

    • 訂用帳戶資源群組區域:與您為 SignalR Service 選擇的一樣

    • 應用程式閘道名稱AG1

    • 虛擬網路:選取 [新建],然後在開啟的 [建立虛擬網路] 視窗中,輸入下列各值來建立虛擬網路和兩個子網路、一個用於應用程式閘道,另一個用於後端伺服器。

      • 名稱:輸入 VN1 代表虛擬網路的名稱。

      • 子網路:使用下列 2 個子網路來更新子網路方格

        子網路名稱 位址範圍 注意
        myAGSubnet (位址範圍) 應用程式閘道的子網路 應用程式閘道子網路只能包含應用程式閘道。 不允許任何其他資源。
        myBackendSubnet (另一個位址範圍) Azure SignalR 執行個體的子網路。
    • 接受其他設定的預設值,然後選取 [下一步:前端]。

  • 在 [前端] 索引標籤上:

    • 前端 IP 位址類型公用
    • 針對 [公用 IP 位址] 選擇 [新增],而針對公用 IP 位址名稱輸入 myAGPublicIPAddress,然後選取 [確定]。
    • 選取 [下一步: 後端]使用 [前端] 索引標籤建立 應用程式閘道 實例的螢幕快照。
  • 在 [後端] 索引標籤上,選取 [新增後端集區]:

    • 名稱:輸入 signalr 代表 SignalR Service 資源後端集區。
    • 後端目標 Target:您的 SignalR Service 執行個體 ASRS1主機名稱,例如 asrs1.service.signalr.net
    • 選取 [下一步:組態]

    設定SignalR服務應用程式閘道後端集區的螢幕快照。

  • 在 [組態] 索引標籤上,選取 [路由規則] 欄中的 [新增路由規則]:

    • 規則名稱myRoutingRule

    • 優先順序:1

    • 在 [新增路由規則] 視窗內的 [接聽程式] 索引標籤上,針對接聽程式輸入下列值:

      • 接聽程式名稱:輸入 myListener 作為接聽程式的名稱。
      • 前端 IP:選取 [公用] 以選擇您針對前端建立的公用 IP。
      • 通訊協定:HTTP
        • 我們在本文中使用應用程式閘道上的 HTTP 前端通訊協定來簡化示範,並協助您更輕鬆地開始。 但在實際上,您可能需要在生產案例中啟用 HTTP 和客戶網域。
      • 接受 [接聽程式] 索引標籤上其他設定的預設值設定 SignalR Service 的應用程式閘道路由規則接聽程式索引標籤螢幕快照。
    • 在 [後端目標] 索引標籤上,使用下列各值:

      • 目標類型:後端集區

      • 後端目標:選取我們先前建立的 signalr

      • 後端設定:選取 [新增] 以新增新的設定。

        • 後端設定名稱mySetting
        • 後端通訊協定HTTPS
        • 使用已知的 CA 憑證
        • 以新的主機名稱覆寫
        • 主機名稱覆寫從後端目標挑選主機名稱
        • 其他請保留預設值

        設定SignalR服務應用程式閘道後端設定的螢幕快照。

      建立應用程式閘道後端目標的螢幕快照。

  • 檢閱和建立 AG1檢閱和建立應用程式閘道實例的螢幕快照。

設定應用程式閘道健全狀態探查

建立 AG1 後,請移至入口網站中 [設定] 區段底下的 [健全狀態探查] 索引標籤,將健全狀態探查路徑變更為 /api/health

設定 SignalR 服務應用程式閘道後端健康情況探查的螢幕快照。

快速測試

  • 嘗試使用無效的用戶端要求 https://asrs1.service.signalr.net/client 而它傳回 400 並顯示錯誤訊息:'hub' query parameter is required。這表示要求已抵達 SignalR Service 並進行要求驗證。

    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 Service。 客戶可以使用應用程式閘道公用 IP 位址或自訂網域名稱來存取資源。 讓我們使用此聊天應用程式作為範例。 讓我們從在本機執行它開始。

原始 連接字串 只會針對示範目的出現在本文中。 在生產環境中,請一律保護您的存取金鑰。 使用 Azure 金鑰保存庫,使用 Microsoft Entra 識別碼安全地管理及輪替密鑰,並保護您的 連接字串,並使用 Microsoft Entra 識別符授權存取權。

  • 首先,讓我們取得 ASRS1 的連接字串

    • ASRS1 的 [連接字串] 索引標籤上
      • 用戶端端點:使用 AG1 的前端公用 IP 位址輸入 URL,例如 http://20.88.8.8。 這是使用反向 Proxy 時的連接字串產生器,下次回到此索引標籤時,不會保留此值。輸入值時,連接字串會附加 ClientEndpoint 區段。
      • 複製連接字串 使用用戶端端點取得 SignalR Service 連接字串 的螢幕快照。
  • 複製 GitHub 存放庫 https://github.com/aspnet/AzureSignalR-samples

  • 移至 samples/Chatroom 資料夾:

  • 設定複製的連接字串並在本機執行應用程式,您可以看到 ConnectionString 中有一個 ClientEndpoint 區段。

    cd samples/Chatroom
    dotnet restore
    dotnet user-secrets set Azure:SignalR:ConnectionString "<copied-connection-string-with-client-endpoint>"
    dotnet run
    
  • 從瀏覽器開啟 http://localhost:5000 並使用 F12 來檢視網路追蹤,您可以看到 WebSocket 連線是透過 AG1 來建立的

    使用應用程式閘道和 SignalR Service 在本機執行聊天應用程式的螢幕快照。

安全的 SignalR Service

在上一節中,我們已成功將 SignalR Service 設定為應用程式閘道的後端服務,我們可以直接從公用網路或透過應用程式閘道來呼叫 SignalR Service。

在本節中,讓我們設定 SignalR Service 來拒絕來自公用網路的所有流量,並且只接受來自應用程式閘道的流量。

設定 SignalR Service

讓我們設定 SignalR Service 只允許專用存取。 您可以在使用專用端點來存取 SignalR Service 中找到更多詳細資料。

  • 移至入口網站中的 SignalR Service 執行個體 ASRS1

  • 移至 [網路功能] 索引標籤:

    • 在 [公用存取] 索引標籤上:將 [公用網路存取] 變更為 [停用] 並按 [儲存],現在您無法再從公用網路存取 SignalR Service

      停用 SignalR 服務的公用存取螢幕快照。

    • 在 [專用存取] 索引標籤上,選取 [+ 專用端點]:

      • 在 [基本] 索引標籤上:
        • 名稱PE1
        • 網路介面名稱PE1-nic
        • 區域:請務必選擇與您應用程式閘道相同的區域
        • 選取 [下一步:資源]
      • 在 [資源] 索引標籤上
        • 保持預設值
        • 選取 [下一步: 虛擬網路]
      • 在 [虛擬網路] 索引標籤上
        • 虛擬網路:選取先前建立的 VN1
        • 子網路:選取先前建立的 VN1/myBackendSubnet
        • 其他請保留預設值
        • 選取 [下一步: DNS]
      • 在 [DNS] 索引標籤上
        • 與專用 DNS 區域整合Yes
      • 檢閱及建立專用端點

重新整理應用程式閘道後端集區

因為應用程式閘道是在有專用端點供其使用之前設定的,所以我們需要為它重新整理後端集區以查看專用 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
    
  • 透過 AG1 http://<frontend-public-IP-address>/client造訪端點,並傳回 400,並需要錯誤訊息 'hub' 查詢參數。 這表示要求已順利通過應用程式閘道到達 SignalR Service。

    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 Service。

讓我們將聊天應用程式部署至與 ASRS1 相同的 VNet,讓聊天可以與 ASRS1 通訊。

將聊天應用程式部署至 Azure

  • Azure 入口網站 上,搜尋 [應用程式服務] 和 [建立 Web 應用程式]。

  • 在 [ 基本] 索引 標籤上,針對下列 Web 應用程式設定使用這些值:

    • 訂用帳戶資源群組區域:與您為 SignalR Service 選擇的一樣
    • 名稱WA1
    • 發佈Code
    • 執行階段堆疊.NET 6 (LTS)
    • 作業系統Linux
    • 區域:請確定它與您為 SignalR Service 選擇的一樣
    • 選取 [ 下一步:部署],保留全部為預設值,然後選取 [ 下一步:網络]
  • 在 [網路功能] 索引標籤上

    • 啟用網路插入:選取 [開啟]
    • 虛擬網路:選取我們先前建立的 VN1
    • 啟用 VNet 整合開啟
    • 輸出子網路:建立新的子網路
    • 選取 [檢閱 + 建立]

現在讓我們將聊天應用程式部署至 Azure。 Below

我們使用 Azure CLI 將聊天應用程式部署至 Azure。 請參閱 快速入門:針對部署至 Azure 的其他部署環境部署 ASP.NET Web 應用程式

在資料夾 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。
  • 移至 [概觀] 索引標籤,並取得 WA1的 URL。

  • 取得 URL,並以 http 取代配置 https,例如 http://wa1.azurewebsites.net,在瀏覽器中開啟該 URL,現在您可以開始聊天了! 使用 F12 來開啟網路追蹤,您可以看到 SignalR 連線是透過 AG1 來建立的。

    注意

    有時候您需要停用瀏覽器的自動 https 重新導向和瀏覽器快取,以防止 URL 自動重新導向至 HTTPS。

    使用應用程式閘道和 SignalR Service 在 Azure 中執行聊天應用程式的螢幕快照。

下一步

現在,您已順利建置具有 SignalR Service 的即時聊天應用程式,以及使用應用程式閘道來保護您的應用程式,並設定端對端安全性。 深入瞭解 SignalR Service