对使用 Microsoft Entra 托管标识向 Azure SignalR 服务资源发出的请求进行授权
Azure SignalR 服务支持使用 Microsoft Entra ID 为来自Microsoft Entra 托管标识的请求授权。
本文介绍了如何配置 Azure SignalR 服务资源和代码,以便为从托管标识发出的资源请求授权。
第一步是配置托管标识。
此示例展示了如何使用 Azure 门户在应用程序服务上配置系统分配的托管标识:
在 Azure 门户左侧导航窗格中的“设置”组下访问应用的设置。
选择“标识”。
在“系统分配的”选项卡中,将“状态”切换为“启用” 。 单击“ 保存”。
若要详细了解如何用其他方式为 Azure 应用程序服务和 Azure Functions 配置托管标识,请参阅如何将托管标识用于应用程序服务和 Azure Functions。
若要详细了解如何在 Azure VM 上配置托管标识,请参阅在 Azure 虚拟机 (VM) 上配置托管标识
以下步骤介绍了如何向系统分配的标识分配对 Azure SignalR 服务资源的 SignalR 应用服务器角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色。
备注
角色可以分配给任何作用域,包括管理组、订阅、资源组或单个资源。 若要了解有关范围的详细信息,请参阅了解 Azure RBAC 的作用域。
在 Azure 门户中,转到你的 Azure SignalR 服务资源。
选择“访问控制(IAM)”。
选择“添加”>“添加角色分配”。
在“角色”选项卡上,选择“SignalR 应用服务器”。
在“成员”选项卡上,选择“托管标识”,然后选择“选择成员”。
选择 Azure 订阅。
选择“系统分配的托管标识”,搜索要向其分配角色的虚拟机,然后将其选中。
在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。
重要
Azure 角色分配可能需要多达 30 分钟时间来进行传播。
若要详细了解如何分配和管理 Azure 角色,请参阅以下文章:
- 使用 Azure 门户分配 Azure 角色
- 使用 REST API 分配 Azure 角色
- 使用 Azure PowerShell 分配 Azure 角色
- 使用 Azure CLI 分配 Azure 角色
- 使用 Azure 资源管理器模板分配 Azure 角色
Azure SignalR SDK 支持基于标识的连接字符串。 如果在应用服务器的环境变量中设置了配置,则不需要重新部署应用服务器,而只需更改配置即可从使用访问密钥改为使用 MSI。 例如,将应用服务器的环境变量 Azure__SignalR__ConnectionString
更新为 Endpoint=https://<resource1>.signalr.azure.cn;AuthType=azure.msi;Version=1.0;
。 或在 DI 代码中设置。
services.AddSignalR().AddAzureSignalR("Endpoint=https://<resource1>.signalr.azure.cn;AuthType=azure.msi;Version=1.0;");
此外,还可以使用 DefaultAzureCredential 或 ManagedIdentityCredential 来配置 Azure SignalR 服务终结点。 最佳做法是直接使用 ManagedIdentityCredential
。
请注意,默认会使用系统分配的托管标识,但如果你使用 DefaultAzureCredential
,请确保不要配置 EnvironmentCredential 保留的任何环境变量。 否则,Azure SignalR 服务会回退为使用 EnvironmentCredential
发出请求,这通常会导致 Unauthorized
响应。
重要
以这种方式从环境变量中删除 Azure__SignalR__ConnectionString
。 Azure__SignalR__ConnectionString
将优先用于构建默认 ServiceEndpoint
,并可能导致你的应用服务器意外使用访问密钥。
services.AddSignalR().AddAzureSignalR(option =>
{
option.Endpoints = new ServiceEndpoint[]
{
new ServiceEndpoint(new Uri("https://<resource1>.signalr.azure.cn"), new ManagedIdentityCredential()),
};
});
在创建 ManagedIdentityCredential
对象时提供 ClientId
。
重要
使用客户端 ID,而不是对象(主体)ID,即使它们都是 GUID。
使用基于标识的连接字符串。
services.AddSignalR().AddAzureSignalR("Endpoint=https://<resource1>.signalr.azure.cn;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>.signalr.azure.cn"), new ManagedIdentityCredential(clientId)),
};
});
Azure Functions 中的 Azure SignalR 服务绑定使用门户中的应用程序设置或本地的 local.settings.json 来配置托管标识,以访问 Azure SignalR 服务资源。
你可能需要使用一组键/值对来配置标识。 所有键/值对的键必须以一个连接名称前缀(默认为 AzureSignalRConnectionString
)和一个分隔符开头。 分隔符在门户中为下划线 (__
),在本地为冒号 (:
)。 你可以通过使用绑定属性 ConnectionStringSetting
来自定义前缀。
如果仅配置服务 URI,请使用 DefaultAzureCredential
类。 当你希望在 Azure 和本地开发环境中共享相同的配置时,此类非常有用。 若要了解它如何工作,请参阅 DefaultAzureCredential。
在 Azure 门户中,使用以下示例来配置 DefaultAzureCredential
。 如果未配置此处列出的任何环境变量,则会使用系统分配的标识进行身份验证。
<CONNECTION_NAME_PREFIX>__serviceUri=https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn
下面是 local.settings.json 文件中的 DefaultAzureCredential
的配置示例。 在本地作用域内,没有托管标识。 将按顺序尝试通过 Visual Studio、Azure CLI 和 Azure PowerShell 帐户进行身份验证。
{
"Values": {
"<CONNECTION_NAME_PREFIX>:serviceUri": "https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn"
}
}
若要单独使用系统分配的标识并且不受其他环境变量的影响,请将包含连接名称前缀的 credential
键设置为 managedidentity
。 下面是应用程序设置示例:
<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn
<CONNECTION_NAME_PREFIX>__credential = managedidentity
如果你要使用用户分配的标识,除了分配 serviceUri
和包含连接名称前缀的 credential
键之外,还需要分配 clientId
。 下面是应用程序设置示例:
<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn
<CONNECTION_NAME_PREFIX>__credential = managedidentity
<CONNECTION_NAME_PREFIX>__clientId = <CLIENT_ID>
请参阅以下相关文章: