Azure SignalR 服务支持使用 Microsoft Entra ID 为来自Azure 资源的托管标识的请求授权。
本文介绍如何设置资源和代码,以使用托管标识授权对资源的请求。
配置托管标识
第一步是在应用或虚拟机上配置托管标识。
在 Azure 门户中添加角色分配
以下步骤介绍如何将 SignalR 应用服务器角色分配给 Azure SignalR 服务资源的服务主体或托管标识。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色。
注意
可以将角色分配给任何范围,包括管理组、订阅、资源组或单个资源。 若要了解有关范围的详细信息,请参阅了解 Azure RBAC 的作用域。
在 Azure 门户中,转到你的 Azure SignalR 服务资源。
在左侧窗格中,选择访问控制 (IAM)。
选择添加>添加角色分配。
在“角色”选项卡上,选择“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 的监视工具时使用。 选择“下一步”。
对于 Microsoft Entra 应用程序:
- 在“将访问权限分配给”行中,选择“用户、组或服务主体”。
- 在成员行中,选择选择成员,然后在弹出窗口中选择身份标识。
对于 Azure 资源的托管标识:
- 在“将访问权限分配给”行中,选择“托管标识”。
- 在“ 成员 ”行中, 选择成员,然后在弹出窗口中选择应用程序。
选择“下一步”。
查看分配,然后选择 “查看 + 分配 ”以确认角色分配。
重要
新添加的角色分配可能需要最多 30 分钟来进行传播。
若要详细了解如何分配和管理 Azure 角色,请参阅:
- 使用 Azure 门户分配 Azure 角色
- 使用 REST API 分配 Azure 角色
- 使用 Azure PowerShell 分配 Azure 角色
- 使用 Azure CLI 分配 Azure 角色
- 使用 Azure 资源管理器模板分配 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>.service.signalr.net"), 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>.service.signalr.net"), 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>.service.signalr.net"), new ManagedIdentityCredential()),
new ServiceEndpoint(new Uri("https://<resource2>.service.signalr.net"), 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>.service.signalr.net
下面是 DefaultAzureCredential
文件中的 的配置示例。 在本地作用域内,没有托管标识。 将按顺序尝试通过 Visual Studio、Azure CLI 和 Azure PowerShell 帐户进行身份验证。
{
"Values": {
"<CONNECTION_NAME_PREFIX>:serviceUri": "https://<SIGNALR_RESOURCE_NAME>.service.signalr.net"
}
}
若要单独使用系统分配的标识并且不受其他环境变量的影响,请将包含连接名称前缀的 credential
键设置为 managedidentity
。 下面是应用程序设置示例:
<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.service.signalr.net
<CONNECTION_NAME_PREFIX>__credential = managedidentity
使用用户分配的标识
如果你要使用用户分配的标识,除了分配 clientId
和包含连接名称前缀的 serviceUri
键之外,还需要分配 credential
。 下面是应用程序设置示例:
<CONNECTION_NAME_PREFIX>__serviceUri = https://<SIGNALR_RESOURCE_NAME>.service.signalr.net
<CONNECTION_NAME_PREFIX>__credential = managedidentity
<CONNECTION_NAME_PREFIX>__clientId = <CLIENT_ID>
后续步骤
请参阅以下相关文章: