使用 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>.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>

后续步骤

请参阅以下相关文章: