使用 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 应用服务器 或其他 SignalR 内置角色取决于你的方案。

    角色 DESCRIPTION 用例
    SignalR 应用服务器 访问服务器连接创建和密钥生成 API。 最常用于在 默认 模式下运行具有 Azure SignalR 资源的应用服务器。
    SignalR 服务所有者 对所有数据平面 API(包括 REST 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. Assign access 到行中,选择“用户、组或服务主体”。
    2. Members 行中,单击 select members,然后选择弹出窗口中的身份。
  7. 对于 Azure 资源的托管标识。

    1. Assign access 到行中,选择“托管标识”
    2. 在行中 Members ,单击 select members,然后在弹出窗口中选择应用程序。
  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>.signalr.azure.cn"), 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>.signalr.azure.cn"), 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>.signalr.azure.cn"), new ManagedIdentityCredential()),
        new ServiceEndpoint(new Uri("https://<resource2>.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

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

使用用户分配的标识

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

<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn
<CONNECTION_NAME_PREFIX>__credential = managedidentity
<CONNECTION_NAME_PREFIX>__clientId = <CLIENT_ID>

后续步骤

请参阅以下相关文章: