使用 Microsoft Entra 受控識別授權對 Azure SignalR Service 資源的要求
Azure SignalR Service 支援 Microsoft Entra ID 用於授權來自 Microsoft Entra 受控識別的要求。
本文說明如何設定您的 Azure SignalR Service 資源和程式碼,以授權來自受控識別的資源要求。
設定受控識別
第一步是設定受控識別。
此範例示範如何使用 Azure 入口網站,在 App Service 上設定系統指派的受控識別:
在 Azure 入口網站中,於左側瀏覽窗格中的 [設定] 群組底下存取應用程式的設定。
選取 [身分識別]。
在 [系統指派] 索引標籤內,將 [狀態] 切換為 [開啟]。 按一下 [檔案] 。
若要深入了解設定 Azure App Service 和 Azure Functions 受控識別的其他方式,請參閱如何使用 App Service 和 Azure Functions 的受控識別。
若要深入了解如何在 Azure VM 上設定受控識別,請參閱在 Azure 虛擬機器上設定受控識別
在 Azure 入口網站上新增角色指派
下列步驟說明如何透過 Azure SignalR Service 資源,將 SignalR App Server 角色指派給系統指派的身分識別。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色。
注意
角色可以指派給任何範圍,包括管理群組、訂閱、資源群組或單一資源。 如需範圍的詳細資訊,請參閱了解 Azure RBAC 的範圍。
在 Azure 入口網站中,移至您的 Azure SignalR Service 資源。
選取 [存取控制 (IAM)]。
選取 [新增>][新增角色指派]。
在 [角色] 索引標籤上,選取 [SignalR App Server]。
在 [成員] 索引標籤上,選取 [受控識別],然後選擇 [選取成員]。
選取 Azure 訂閱。
選取 [系統指派的受控識別],搜尋您要指派角色的虛擬機器,然後加以選取。
在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。
重要
Azure 角色指派最多需要 30 分鐘的時間來傳播。
若要進一步了解如何指派和管理 Azure 角色,請參閱以下文章:
- 使用 Azure 入口網站指派 Azure 角色
- 使用 REST API 指派 Azure 角色
- 使用 Azure PowerShell 指派 Azure 角色
- 使用 Azure CLI 指派 Azure 角色
- 使用 Azure Resource Manager 範本指派 Azure 角色
設定您的應用程式
應用程式伺服器
使用系統指派的身分識別
Azure SignalR SDK 支援以身分識別為基礎的連接字串。 如果組態是在應用程式伺服器的環境變數中設定,您就不需要重新部署應用程式伺服器,而只需要進行組態變更,即可從存取金鑰移轉至 MSI。 例如,將應用程式伺服器的環境變數 Azure__SignalR__ConnectionString
更新為 Endpoint=https://<resource1>.service.signalr.net;AuthType=azure.msi;Version=1.0;
。 或在 DI 程式碼中設定。
services.AddSignalR().AddAzureSignalR("Endpoint=https://<resource1>.service.signalr.net;AuthType=azure.msi;Version=1.0;");
此外,您可以使用 DefaultAzureCredential 或 ManagedIdentityCredential 來設定 Azure SignalR Service 端點。 最佳做法是直接使用 ManagedIdentityCredential
。
請注意,預設使用系統指派的受控識別,但如果您目前使用 DefaultAzureCredential
,切勿設定 EnvironmentCredential 所保留的任何環境變數。 否則,Azure SignalR Service 會回復為使用 EnvironmentCredential
來提出要求,這通常會導致 Unauthorized
回應。
重要
以這種方式從環境變數中移除 Azure__SignalR__ConnectionString
。 Azure__SignalR__ConnectionString
將用來建置具有第一優先順序的預設 ServiceEndpoint
,並可能導致應用程式伺服器意外地使用存取金鑰。
services.AddSignalR().AddAzureSignalR(option =>
{
option.Endpoints = new ServiceEndpoint[]
{
new ServiceEndpoint(new Uri("https://<resource1>.service.signalr.net"), new ManagedIdentityCredential()),
};
});
使用使用者指派的身分識別
在建立 ManagedIdentityCredential
物件時提供 ClientId
。
重要
使用用戶端識別碼,而不是物件 (主體) 識別碼,即使兩者都是 GUID。
使用身份識別型連接字串。
services.AddSignalR().AddAzureSignalR("Endpoint=https://<resource1>.service.signalr.net;AuthType=azure.msi;ClientId=<your-user-identity-client-id>;Version=1.0;");
或使用 ManagedIdentityCredential
建置 ServiceEndpoint
。
services.AddSignalR().AddAzureSignalR(option =>
{
option.Endpoints = new ServiceEndpoint[]
{
var clientId = "<your-user-identity-client-id>";
new ServiceEndpoint(new Uri("https://<resource1>.service.signalr.net"), new ManagedIdentityCredential(clientId)),
};
});
Azure Functions 中的 Azure SignalR Service 繫結
Azure Functions 中的 Azure SignalR Service 繫結會在入口網站中使用應用程式設定,或在本機使用 local.settings.json 來設定受控識別,以存取您的 Azure SignalR Service 資源。
您可能需要使用機碼值組設定身分識別。 所有機碼值組的索引碼開頭都必須為一個連線名稱前置詞 (預設為 AzureSignalRConnectionString
) 加上一個分隔符號。 分隔符號在入口網站中是底線 (__
),在本機則是冒號 (:
)。 您可以使用繫結屬性 ConnectionStringSetting
來自訂前置詞。
使用系統指派的身分識別
如果您只設定服務 URI,請使用 DefaultAzureCredential
類別。 當您想要在 Azure 和本機開發環境中共用相同設定時,這個類別非常有用。 若要了解運作方式,請參閱 DefaultAzureCredential。
在 Azure 入口網站中,使用下列範例來設定 DefaultAzureCredential
。 如果您未設定任何這些環境變數,則會使用系統指派的身分識別進行驗證。
<CONNECTION_NAME_PREFIX>__serviceUri=https://<SIGNALR_RESOURCE_NAME>.service.signalr.net
以下是 local.settings.json 檔案中 DefaultAzureCredential
的組態範例。 在本機範圍內,沒有受控識別。 依序會嘗試透過 Visual Studio、Azure CLI 和 Azure PowerShell 帳戶進行驗證。
{
"Values": {
"<CONNECTION_NAME_PREFIX>:serviceUri": "https://<SIGNALR_RESOURCE_NAME>.service.signalr.net"
}
}
如果您想獨立使用系統指派的身分識別,而不受其他環境變數的影響,請將含有連線名稱前置詞的 credential
索引鍵設為 managedidentity
。 以下是應用程式設定的範例:
<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.service.signalr.net
<CONNECTION_NAME_PREFIX>__credential = managedidentity
使用使用者指派的身分識別
如果您想要使用使用者指派的身分識別,除了具有連線名稱前置詞的 serviceUri
和 credential
金鑰之外,還需要指派 clientId
。 以下是應用程式設定的範例:
<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.service.signalr.net
<CONNECTION_NAME_PREFIX>__credential = managedidentity
<CONNECTION_NAME_PREFIX>__clientId = <CLIENT_ID>
下一步
請參閱下列相關文章: