对使用 Microsoft Entra 托管标识向 Azure SignalR 服务资源发出的请求进行授权

Azure SignalR 服务支持使用 Microsoft Entra ID 为来自Microsoft Entra 托管标识的请求授权。

本文介绍了如何配置 Azure SignalR 服务资源和代码,以便为从托管标识发出的资源请求授权。

配置托管标识

第一步是配置托管标识。

此示例展示了如何使用 Azure 门户在应用程序服务上配置系统分配的托管标识:

  1. Azure 门户左侧导航窗格中的“设置”组下访问应用的设置。

  2. 选择“标识”。

  3. 在“系统分配的”选项卡中,将“状态”切换为“启用” 。 单击“ 保存”。

    屏幕截图显示了在何处将“状态”切换为“启用”,然后选择“保存”。

若要详细了解如何用其他方式为 Azure 应用程序服务和 Azure Functions 配置托管标识,请参阅如何将托管标识用于应用程序服务和 Azure Functions

若要详细了解如何在 Azure VM 上配置托管标识,请参阅在 Azure 虚拟机 (VM) 上配置托管标识

在 Azure 门户中添加角色分配

以下步骤介绍了如何向系统分配的标识分配对 Azure SignalR 服务资源的 SignalR 应用服务器角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

注意

角色可以分配给任何作用域,包括管理组、订阅、资源组或单个资源。 若要了解有关范围的详细信息,请参阅了解 Azure RBAC 的作用域

  1. Azure 门户中,转到你的 Azure SignalR 服务资源。

  2. 选择“访问控制(IAM)”。

  3. 选择“添加”>“添加角色分配”。

    屏幕截图显示了用于添加角色分配的访问控制和选择页面。

  4. 在“角色”选项卡上,选择“SignalR 应用服务器”。

  5. 在“成员”选项卡上,选择“托管标识”,然后选择“选择成员”。

  6. 选择 Azure 订阅。

  7. 选择“系统分配的托管标识”,搜索要向其分配角色的虚拟机,然后将其选中

  8. 在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。

重要

Azure 角色分配可能需要多达 30 分钟时间来进行传播。

若要详细了解如何分配和管理 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;");

此外,还可以使用 DefaultAzureCredentialManagedIdentityCredential 来配置 Azure SignalR 服务终结点。 最佳做法是直接使用 ManagedIdentityCredential

请注意,默认会使用系统分配的托管标识,但如果你使用 DefaultAzureCredential,请确保不要配置 EnvironmentCredential 保留的任何环境变量。 否则,Azure SignalR 服务会回退为使用 EnvironmentCredential 发出请求,这通常会导致 Unauthorized 响应。

重要

以这种方式从环境变量中删除 Azure__SignalR__ConnectionStringAzure__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>

后续步骤

请参阅以下相关文章: