如何搭配 Azure 應用程式閘道使用 Azure SignalR Service
應用程式閘道是網路流量負載平衡器,可讓您管理 Web 應用程式的流量。 搭配 SignalR Service 使用應用程式閘道可讓您執行下列動作:
- 保護您的應用程式免受常見 Web 漏洞的侵害。
- 取得可調整和高可用性應用程式的應用程式層級負載平衡。
- 設定端對端安全性。
- 自訂網域名稱。
本文包含兩個部分:
- 第一個部分示範如何設定應用程式閘道,讓用戶端可以透過應用程式閘道來存取 SignalR。
- 第二個部分示範如何將存取控制新增至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
- 選取 [下一步:組態]
在 [組態] 索引標籤上,選取 [路由規則] 欄中的 [新增路由規則]:
規則名稱:myRoutingRule
優先順序:1
在 [新增路由規則] 視窗內的 [接聽程式] 索引標籤上,針對接聽程式輸入下列值:
- 接聽程式名稱:輸入 myListener 作為接聽程式的名稱。
- 前端 IP:選取 [公用] 以選擇您針對前端建立的公用 IP。
- 通訊協定:HTTP
- 我們在本文中使用應用程式閘道上的 HTTP 前端通訊協定來簡化示範,並協助您更輕鬆地開始。 但在實際上,您可能需要在生產案例中啟用 HTTP 和客戶網域。
- 接受 [接聽程式] 索引標籤上其他設定的預設值
在 [後端目標] 索引標籤上,使用下列各值:
目標類型:後端集區
後端目標:選取我們先前建立的 signalr
後端設定:選取 [新增] 以新增新的設定。
- 後端設定名稱:mySetting
- 後端通訊協定:HTTPS
- 使用已知的 CA 憑證:是
- 以新的主機名稱覆寫:是
- 主機名稱覆寫:從後端目標挑選主機名稱
- 其他請保留預設值
檢閱和建立 AG1
設定應用程式閘道健全狀態探查
建立 AG1 後,請移至入口網站中 [設定] 區段底下的 [健全狀態探查] 索引標籤,將健全狀態探查路徑變更為 /api/health
快速測試
嘗試使用無效的用戶端要求
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 位址
請流覽透過 AG1
http://<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
區段。 - 複製連接字串
- 用戶端端點:使用 AG1 的前端公用 IP 位址輸入 URL,例如
- 在 ASRS1 的 [連接字串] 索引標籤上
複製 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 執行個體 ASRS1。
移至 [網路功能] 索引標籤:
在 [公用存取] 索引標籤上:將 [公用網路存取] 變更為 [停用] 並按 [儲存],現在您無法再從公用網路存取 SignalR Service
在 [專用存取] 索引標籤上,選取 [+ 專用端點]:
- 在 [基本] 索引標籤上:
- 名稱: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
在 [ 基本] 索引 標籤上,針對下列 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 值的複製連接字串 選取 [自訂]。
在 [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 的即時聊天應用程式,以及使用應用程式閘道來保護您的應用程式,並設定端對端安全性。 深入瞭解 SignalR Service。