使用 Microsoft Entra 应用程序为针对 Azure SignalR 服务资源的请求进行授权

Azure SignalR 服务支持从 Microsoft Entra 应用程序使用 Microsoft Entra ID 为请求授权。

本文介绍如何配置 Azure SignalR 服务资源和代码,从 Microsoft Entra 应用程序为针对资源的请求授权。

注册应用程序

第一步是注册 Microsoft Entra 应用程序:

  1. Azure 门户中,搜索并选择“Microsoft Entra ID”

  2. 在“管理”下,选择“应用注册”。

  3. 选择新建注册。 “注册应用程序”窗格将打开

    用于注册应用程序的窗格的屏幕截图。

  4. 对于“名称”,请输入应用程序的显示名称

  5. 选择“注册”以确认注册

注册应用程序后,在应用程序的概述页上找到应用程序的“应用程序(客户端) ID”和“目录(租户) ID”值。 这些 GUID 在以下步骤中很实用。

已注册的应用程序的概述信息的屏幕截图。

若要了解如何注册应用程序,请参阅快速入门:将应用程序注册到 Microsoft 标识平台

添加凭据

可将证书和客户端密码(字符串)作为凭据添加到机密客户端应用注册。

客户端密码

请求令牌时,应用程序需要使用客户端密码来证明其身份。 若要创建客户端密码,请执行以下步骤:

  1. 在“管理”下,选择“证书和机密”

  2. 在“客户端密码”选项卡上,选择“新建客户端密码”。

    用于创建客户端机密的选择内容的屏幕截图。

  3. 输入客户端密码的说明,然后选择到期时间。

  4. 复制客户端密码的值,然后将其粘贴到安全位置。

    注意

    客户端密码只显示一次。

证书

你可以上传证书,而不是创建客户端密码。

用于上传证书的选择内容的屏幕截图。

若要了解有关添加凭据的详细信息,请参阅添加凭据

在 Azure 门户中添加角色分配

以下步骤介绍如何通过 Azure SignalR 服务资源将 SignalR 应用服务器角色分配给服务主体(应用程序)。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

注意

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

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

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

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

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

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

  5. 在“成员”选项卡上,选择“用户、组或服务主体”,然后选择“选择成员”

  6. 搜索并选择要将角色分配给的应用程序。

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

重要

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

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

配置应用程序

应用服务器

最佳做法是在环境变量中配置标识和凭据:

变量 说明
AZURE_TENANT_ID Microsoft Entra 租户 ID。
AZURE_CLIENT_ID 租户中应用注册的客户端(应用程序)ID。
AZURE_CLIENT_SECRET 为应用注册生成的客户端密码。
AZURE_CLIENT_CERTIFICATE_PATH PEM 或 PFX 格式的证书和私钥对的路径,可对应用注册进行身份验证。
AZURE_USERNAME Microsoft Entra 用户帐户的用户名,也称为用户主体名称 (UPN)。
AZURE_PASSWORD Microsoft Entra 用户帐户的密码。 启用了多重身份验证的帐户不支持密码。

可以使用 DefaultAzureCredentialEnvironmentCredential 来配置 Azure SignalR 服务终结点。 下面是 DefaultAzureCredential 的代码:

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

下面是 EnvironmentCredential 的代码:

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

若要了解 DefaultAzureCredential 工作原理,请参阅 DefaultAzureCredential 类

使用终结点特定凭据

在组织中,你可能希望对不同的终结点使用不同的凭据。

在此场景中,可以使用 ClientSecretCredentialClientCertificateCredential

services.AddSignalR().AddAzureSignalR(option =>
{
    var credential1 = new ClientSecretCredential("tenantId", "clientId", "clientSecret", new TokenCredentialOptions { AuthorityHost=AzureAuthorityHosts.AzureChina});
    var credential2 = new ClientCertificateCredential("tenantId", "clientId", "pathToCert", new TokenCredentialOptions { AuthorityHost=AzureAuthorityHosts.AzureChina});

    option.Endpoints = new ServiceEndpoint[]
    {
        new ServiceEndpoint(new Uri("https://<resource1>.signalr.azure.cn"), credential1),
        new ServiceEndpoint(new Uri("https://<resource2>.signalr.azure.cn"), credential2),
    };
});

Azure Functions 中的 SignalR 服务绑定

Azure Functions 中的 Azure SignalR 服务绑定使用门户中的应用程序设置或本地的 local.settings.json 来配置 Microsoft Entra 应用程序标识,以访问 Azure SignalR 服务资源。

首先,需要指定 Azure SignalR 服务的服务 URI。 该服务 URI 的键为 serviceUri。 其开头为连接名称前缀(默认为 AzureSignalRConnectionString)和分隔符。 分隔符在 Azure 门户中为下划线 (__),在 local.settings.json 文件中为冒号 (:)。 可通过使用绑定属性 ConnectionStringSetting 自定义连接名称。 继续阅读,查找示例。

然后,选择是以预定义环境变量还是以 SignalR 指定变量配置 Microsoft Entra 应用程序标识。

以预定义环境变量配置标识

有关预定义环境变量的列表,请参阅环境变量。 当有多个服务时,建议使用同一应用程序标识,因为这样做不需要为每个服务配置标识。 其他服务也可能根据这些服务的设置使用这些环境变量。

例如,若要使用客户端密码凭据,请在 local.settings.json 文件中按如下所示配置标识

{
  "Values": {
    "<CONNECTION_NAME_PREFIX>:serviceUri": "https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn",
    "AZURE_CLIENT_ID": "...",
    "AZURE_CLIENT_SECRET": "...",
    "AZURE_TENANT_ID": "..."
  }
}

在 Azure 门户中,按如下方式添加设置:

 <CONNECTION_NAME_PREFIX>__serviceUri=https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn
AZURE_CLIENT_ID = ...
AZURE_TENANT_ID = ...
AZURE_CLIENT_SECRET = ...

以 SignalR 指定变量配置标识

SignalR 指定变量与 serviceUri 键共享相同的键前缀。 下面是可以使用的变量的列表:

  • clientId
  • clientSecret
  • tenantId

下面是在 local.settings.json 文件中使用客户端密码凭据的示例

{
  "Values": {
    "<CONNECTION_NAME_PREFIX>:serviceUri": "https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn",
    "<CONNECTION_NAME_PREFIX>:clientId": "...",
    "<CONNECTION_NAME_PREFIX>:clientSecret": "...",
    "<CONNECTION_NAME_PREFIX>:tenantId": "..."
  }
}

在 Azure 门户中,按如下方式添加设置:

<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.signalr.azure.cn
<CONNECTION_NAME_PREFIX>__clientId = ...
<CONNECTION_NAME_PREFIX>__clientSecret = ...
<CONNECTION_NAME_PREFIX>__tenantId = ...

后续步骤

请参阅以下相关文章: