共用方式為


如何整合 Azure SignalR 與反向 Proxy

反向 Proxy 伺服器可在 Azure SignalR Service 前面使用。 反向 Proxy 伺服器位於用戶端與 Azure SignalR 服務之間,而且其他服務可以協助各種案例。 例如,反向 Proxy 伺服器可以將不同的用戶端要求負載平衡至不同的後端服務,您通常可以針對不同的用戶端要求設定不同的路由規則,並為存取不同後端服務的使用者提供順暢的使用者體驗。 其也可以利用集中式保護控制,保護您的後端伺服器免於常見的惡意探索弱點。 Azure 應用程式閘道Azure API 管理Akamai 等服務可以做為反向 Proxy 伺服器。

使用反向 Proxy 伺服器搭配 Azure SignalR 的常見結構如下:

此圖顯示搭配反向 Proxy 伺服器使用 Azure SignalR 的架構。

重要

原始 連接字串 只針對示範目的出現在本文中。

連接字串包含應用程式存取 Azure Web PubSub 服務所需的授權資訊。 連接字串內的存取金鑰類似於服務的根密碼。 在生產環境中,請一律保護您的存取金鑰。 使用 Azure 金鑰保存庫,使用 Microsoft Entra 識別元安全地管理和輪替密鑰,以及使用 Microsoft Entra 識別符授權存取權,並保護您的 連接字串。

避免將存取金鑰散發給其他使用者、寫入程式碼,或將其以純文字儲存在他人可以存取的位置。 如果您認為金鑰可能已遭盜用,請輪替金鑰。

一般實務

在 SignalR Service 前面使用反向 Proxy 時,有數個一般做法要遵循。

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

  • 請務必使用 Azure SignalR Service URL 重寫傳入 HTTP HOST 標頭,例如 https://demo.service.signalr.net。 Azure SignalR 是多租用戶服務,且依賴 HOST 標頭解析為正確的端點。 例如,在針對 Azure SignalR 設定應用程式閘道時,請針對 [使用新的主機名稱覆寫] 選項選取 [是]

  • 當您的用戶端通過反向 Proxy 前往 Azure SignalR 時,請將 ClientEndpoint 設定為反向 Proxy URL。 當您的用戶端與中樞伺服器「交涉」時,中樞伺服器會傳回 ClientEndpoint 中定義的 URL,以供用戶端連線。 如需詳細資訊,請參閱這裡。

    有兩種方式可以設定 ClientEndpoint

    • ClientEndpoint 區段新增至 ConnectionString:Endpoint=...;AccessKey=...;ClientEndpoint=<reverse-proxy-URL>

    • 呼叫 AddAzureSignalR 時設定 ClientEndpoint

      services.AddSignalR().AddAzureSignalR(o =>
      {
          o.Endpoints = new Microsoft.Azure.SignalR.ServiceEndpoint[1]
          {
              new Microsoft.Azure.SignalR.ServiceEndpoint("<azure-signalr-connection-string>")
              {
                  ClientEndpoint = new Uri("<reverse-proxy-URL>")
              }
          };
      })
      
  • 當用戶端通過反向 Proxy 前往 Azure SignalR 時,有兩種類型的要求:

    • <reverse-proxy-URL>/client/negotiate/ 的 HTTP 張貼要求,我們將其稱為交涉要求
    • WebSocket/SSE/LongPolling 連線要求,取決於您對 <reverse-proxy-URL>/client/ 的傳輸類型,我們將其稱為連線要求

    確定反向 Proxy 同時支援 /client/ 子路徑的這兩種傳輸類型。 例如,當您的傳輸類型為 WebSocket 時,請確定反向 Proxy 同時支援 HTTP 和 WebSocket 適用於 /client/ 子路徑。

    如果您已在反向 Proxy 後面設定多個 SignalR 服務,請確定具有相同 asrs_request_id 查詢參數的 negotiate 要求和 connect 要求 (表示其適用於相同的連線) 路由至相同的 SignalR Service 執行個體。

  • 使用反向 Proxy 時,您可以停用公用網路存取,並使用 私人端點,只允許透過 VNet 從反向 Proxy 到 SignalR 服務的私人存取,進一步保護您的 SignalR Service。

下一步