使用 Azure 资源的托管标识授权对 Azure SignalR 资源的请求

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

本文介绍如何设置资源和代码,以使用托管标识授权对资源的请求。

配置托管标识

第一步是在应用或虚拟机上配置托管标识。

在 Azure 门户中添加角色分配

以下步骤介绍如何将 SignalR 应用服务器角色分配给 Azure SignalR 服务资源的服务主体或托管标识。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

注意

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

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

  2. 在左侧窗格中,选择访问控制 (IAM)

  3. 选择添加>添加角色分配

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

  4. 在“角色”选项卡上,选择“SignalR 应用服务器”。 其他 Azure SignalR 服务内置角色取决于你的方案。

    角色 DESCRIPTION 用例
    SignalR 应用服务器 访问创建服务器连接和生成密钥的 API。 最常用于在默认模式下运行 Azure SignalR 资源的应用服务器。
    SignalR 服务所有者 完全访问所有数据平面 API,包括 REST API、创建服务器连接的 API 以及生成密钥/令牌的 API。 用于在无服务器模式下运行 Azure SignalR 服务资源的协商服务器。 它需要 REST API 权限和身份验证 API 权限。
    SignalR REST API 所有者 对数据平面 REST API 的完全访问。 用于 Azure SignalR 管理 SDK 来管理连接和组,但它 进行服务器连接或处理协商请求。
    SignalR REST API 读者 对数据平面 REST API 的只读访问。 编写调用只读 REST API 的监视工具时使用。
  5. 选择“下一步”。

  6. 对于 Microsoft Entra 应用程序:

    1. 在“将访问权限分配给”行中,选择“用户、组或服务主体”
    2. 成员行中,选择选择成员,然后在弹出窗口中选择身份标识。
  7. 对于 Azure 资源的托管标识:

    1. 在“将访问权限分配给”行中,选择“托管标识”。
    2. 在“ 成员 ”行中, 选择成员,然后在弹出窗口中选择应用程序。
  8. 选择“下一步”。

  9. 查看分配,然后选择 “查看 + 分配 ”以确认角色分配。

重要

新添加的角色分配可能需要最多 30 分钟来进行传播。

若要详细了解如何分配和管理 Azure 角色,请参阅:

配置适用于 C# 的 Microsoft.Azure.SignalR 应用服务器 SDK

适用于 C 的 Azure SignalR 服务器 SDK#

Azure SignalR 服务器 SDK 利用 Azure.Identity 库 生成用于连接到资源的令牌。 单击可浏览详细使用情况。

使用系统分配的标识

services.AddSignalR().AddAzureSignalR(option =>
{
    option.Endpoints = new ServiceEndpoint[]
    {
        new ServiceEndpoint(new Uri("https://<resource-name>.service.signalr.net"), new ManagedIdentityCredential()),
    };
});

使用用户分配的标识

重要

使用客户端 ID,而不是对象(主体)ID

services.AddSignalR().AddAzureSignalR(option =>
{
    option.Endpoints = new ServiceEndpoint[]
    {
        var clientId = "<your-user-assigned-identity-client-id>";
        new ServiceEndpoint(new Uri("https://<resource-name>.service.signalr.net"), new ManagedIdentityCredential(clientId)),
    };
});

可以在此示例链接中找到更多 示例

使用多个终结点

不同终结点的凭据可能不同。

在此示例中,Azure SignalR SDK 将使用系统分配的托管标识连接到 resource1,并使用用户分配的托管标识连接到 resource2

services.AddSignalR().AddAzureSignalR(option =>
{
    option.Endpoints = new ServiceEndpoint[]
    {
        var clientId = "<your-user-assigned-identity-client-id>";
        new ServiceEndpoint(new Uri("https://<resource1>.service.signalr.net"), new ManagedIdentityCredential()),
        new ServiceEndpoint(new Uri("https://<resource2>.service.signalr.net"), 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>.service.signalr.net

下面是 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

使用用户分配的标识

如果你要使用用户分配的标识,除了分配 clientId 和包含连接名称前缀的 serviceUri 键之外,还需要分配 credential。 下面是应用程序设置示例:

<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.service.signalr.net
<CONNECTION_NAME_PREFIX>__credential = managedidentity
<CONNECTION_NAME_PREFIX>__clientId = <CLIENT_ID>

后续步骤

请参阅以下相关文章: