Azure SignalR 服务支持 Microsoft Entra ID,以便使用 Microsoft Entra 应用程序来授权请求。
本文介绍如何设置资源和代码,以使用 Microsoft Entra 应用程序对资源的请求进行身份验证。
在 Microsoft Entra ID 中注册应用程序
第一步是在 Microsoft Entra ID 中注册应用程序:
注册应用程序后,在应用程序的概述页上找到应用程序的“应用程序(客户端) ID”和“目录(租户) ID”值。 这些 GUID 在以下步骤中很实用。
添加凭据
注册应用后,可以将 证书、客户端机密(字符串)或联合标识凭据 作为凭据添加到机密客户端应用注册。 凭据允许应用程序以自身身份进行身份验证,无需在运行时与用户交互,并由访问 Web API 的机密客户端应用程序使用。
在 Azure 门户中添加角色分配
以下步骤介绍如何将 SignalR 应用服务器角色分配给 Azure SignalR 服务资源的服务主体或托管标识。 有关详细步骤,请参阅 使用 Azure 门户分配 Azure 角色。
注意
可以将角色分配给任何范围,包括管理组、订阅、资源组或单个资源。 若要了解有关范围的详细信息,请参阅 了解 Azure RBAC 的范围。
在 Azure 门户中,转到 Azure SignalR 服务资源。
在左侧窗格中,选择“访问控制(IAM)”。
选择“添加”“添加角色分配”。
在“ 角色 ”选项卡上,选择 SignalR 应用服务器。 其他 Azure SignalR 服务内置角色取决于你的方案。
角色 说明 用例 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 的监视工具时使用。 选择“下一步”。
对于 Microsoft Entra 应用程序:
- 在 “赋予访问权限” 行中,选择 “用户、组或服务主体”。
- 在成员行中,选择成员,然后在弹出窗口中选择身份。
对于 Azure 资源的托管标识:
- 在 “分配访问权限到” 一行中, 选择 “托管标识”。
- 在“ 成员 ”行中, 选择成员,然后在弹出窗口中选择应用程序。
选择“下一步”。
查看分配,然后选择 “查看 + 分配 ”以确认角色分配。
重要
新添加的角色分配可能需要最多 30 分钟来进行传播。
若要详细了解如何分配和管理 Azure 角色,请参阅:
- 使用 Azure 门户分配 Azure 角色
- 使用 REST API 分配 Azure 角色
- 使用 Azure PowerShell 分配 Azure 角色
- 使用 Azure CLI 分配 Azure 角色
- 使用 Azure 资源管理器模板分配 Azure 角色
配置 Microsoft.Azure.SignalR 应用服务器的 C# SDK
适用于 C 的 Azure SignalR 服务器 SDK#
Azure SignalR 服务器 SDK 利用 Azure.Identity 库 生成用于连接到资源的令牌。 单击可浏览详细使用情况。
注意
tenantId 必须与 SignalR 资源所在的租户的 tenantId 匹配。
将 Microsoft Entra 应用程序与证书配合使用
services.AddSignalR().AddAzureSignalR(option =>
{
var credential = new ClientCertificateCredential("tenantId", "clientId", "path-to-cert");
option.Endpoints = [
new ServiceEndpoint(new Uri(), "https://<resource>.signalr.azure.cn"), credential);
];
});
将 Microsoft Entra 应用程序与客户端密码配合使用
services.AddSignalR().AddAzureSignalR(option =>
{
var credential = new ClientSecretCredential("tenantId", "clientId", "clientSecret");
option.Endpoints = [
new ServiceEndpoint(new Uri(), "https://<resource>.signalr.azure.cn"), credential);
];
});
将 Microsoft Entra 应用程序与联合标识配合使用
如果组织禁用了客户端机密/证书的使用,可以将应用程序配置为信任托管标识进行身份验证。
若要了解详细信息,请参阅配置应用程序以信任托管标识(预览版)。
注意
将应用程序配置为信任托管标识是一项预览功能。
services.AddSignalR().AddAzureSignalR(option =>
{
var msiCredential = new ManagedIdentityCredential("msiClientId");
var credential = new ClientAssertionCredential("tenantId", "appClientId", async (ctoken) =>
{
// Entra ID China operated by 21Vianet: api://AzureADTokenExchangeChina
var request = new TokenRequestContext([$"api://AzureADTokenExchangeChina/.default"]);
var response = await msiCredential.GetTokenAsync(request, ctoken).ConfigureAwait(false);
return response.Token;
});
option.Endpoints = [
new ServiceEndpoint(new Uri(), "https://<resource>.signalr.azure.cn"), credential);
];
});
此凭据将使用用户分配的托管标识来生成 clientAssertion 并使用它来交换用于身份验证的 clientToken。
appClientId 和 tenantId 应该是你在 SignalR 资源的租户中预配的企业应用程序。
使用多个终结点
不同终结点的凭据可能不同。
在此示例中,Azure SignalR SDK 将使用客户端密码连接到resource1,并使用证书连接到resource2。
services.AddSignalR().AddAzureSignalR(option =>
{
var credential1 = new ClientSecretCredential("tenantId", "clientId", "clientSecret", new TokenCredentialOptions { AuthorityHost=AzureAuthorityHosts.AzureChina});
var credential2 = new ClientCertificateCredential("tenantId", "clientId", "path-to-cert", 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 键共享相同的键前缀。 下面是可以使用的变量的列表:
clientIdclientSecrettenantId
下面是在 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 = ...
后续步骤
请参阅以下相关文章: