对使用 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 门户中添加角色分配
以下步骤介绍了如何向系统分配的标识分配对 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 服务绑定
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>
后续步骤
请参阅以下相关文章: