使用 Microsoft Entra 应用程序为针对 Azure SignalR 服务资源的请求进行授权
Azure SignalR 服务支持从 Microsoft Entra 应用程序使用 Microsoft Entra ID 为请求授权。
本文介绍如何配置 Azure SignalR 服务资源和代码,从 Microsoft Entra 应用程序为针对资源的请求授权。
注册应用程序
第一步是注册 Microsoft Entra 应用程序:
在 Azure 门户中,搜索并选择“Microsoft Entra ID”。
在“管理”下,选择“应用注册”。
选择新建注册。 “注册应用程序”窗格将打开。
对于“名称”,请输入应用程序的显示名称。
选择“注册”以确认注册。
注册应用程序后,在应用程序的概述页上找到应用程序的“应用程序(客户端) ID”和“目录(租户) ID”值。 这些 GUID 在以下步骤中很实用。
若要了解如何注册应用程序,请参阅快速入门:将应用程序注册到 Microsoft 标识平台。
添加凭据
可将证书和客户端密码(字符串)作为凭据添加到机密客户端应用注册。
客户端密码
请求令牌时,应用程序需要使用客户端密码来证明其身份。 若要创建客户端密码,请执行以下步骤:
在“管理”下,选择“证书和机密”。
在“客户端密码”选项卡上,选择“新建客户端密码”。
输入客户端密码的说明,然后选择到期时间。
复制客户端密码的值,然后将其粘贴到安全位置。
注意
客户端密码只显示一次。
证书
你可以上传证书,而不是创建客户端密码。
若要了解有关添加凭据的详细信息,请参阅添加凭据。
在 Azure 门户中添加角色分配
以下步骤介绍如何通过 Azure SignalR 服务资源将 SignalR 应用服务器角色分配给服务主体(应用程序)。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色。
注意
角色可以分配给任何作用域,包括管理组、订阅、资源组或单个资源。 若要了解有关范围的详细信息,请参阅了解 Azure RBAC 的作用域。
在 Azure 门户中,转到你的 Azure SignalR 服务资源。
选择“访问控制(IAM)”。
选择“添加”>“添加角色分配”。
在“角色”选项卡上,选择“SignalR 应用服务器”。
在“成员”选项卡上,选择“用户、组或服务主体”,然后选择“选择成员”。
搜索并选择要将角色分配给的应用程序。
在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。
重要
Azure 角色分配可能需要多达 30 分钟时间来进行传播。
若要详细了解如何分配和管理 Azure 角色,请参阅以下文章:
- 使用 Azure 门户分配 Azure 角色
- 使用 REST API 分配 Azure 角色
- 使用 Azure PowerShell 分配 Azure 角色
- 使用 Azure CLI 分配 Azure 角色
- 使用 Azure 资源管理器模板分配 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 用户帐户的密码。 启用了多重身份验证的帐户不支持密码。 |
可以使用 DefaultAzureCredential 或 EnvironmentCredential 来配置 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 类。
使用终结点特定凭据
在组织中,你可能希望对不同的终结点使用不同的凭据。
在此场景中,可以使用 ClientSecretCredential 或 ClientCertificateCredential。
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 = ...
后续步骤
请参阅以下相关文章: