使用 Microsoft Entra ID 对应用程序进行身份验证和授权,使其能够访问 Azure 中继实体

Azure 中继支持使用 Microsoft Entra ID 来授权对 Azure 中继实体(混合连接、WCF 中继)的请求。 可以通过 Microsoft Entra ID 使用 Azure 基于角色的访问控制 (Azure RBAC) 授予对安全主体的访问权限,该安全主体可能是用户、组或应用程序服务主体。 若要详细了解角色和角色分配,请参阅了解不同的角色

概述

在某个安全主体(用户、组、应用程序)试图访问中继实体时,请求必须获得授权。 如果使用 Microsoft Entra ID,访问资源流程需要两步。

  1. 首先,验证安全主体的身份并返回 OAuth 2.0 令牌。 用于请求令牌的资源名称为 https://relay.chinacloudapi.cn。 如果某个应用程序在 Azure 实体(例如 Azure VM、虚拟机规模集或 Azure 函数应用)中运行,那么,它就可以使用托管标识来访问这些资源。
  2. 接下来,该令牌会作为请求的一部分传递到中继服务,以授权访问指定的资源(混合连接、WCF 中继)。 Microsoft Entra ID 通过 Azure 基于角色的访问控制 (Azure RBAC)授权访问受保护的资源。 Azure 中继定义了一组 Azure 内置角色,它们包含用于访问中继实体的通用权限集。 还可以定义自定义角色来访问这些数据。 有关 Azure 中继支持的内置角色的列表,请参阅适用于 Azure 中继的 Azure 内置角色。 向中继发出请求的本机应用程序和 Web 应用程序也可以通过 Microsoft Entra ID 进行授权。

适用于 Azure 中继的 Azure 内置角色

对于 Azure 中继,通过 Azure 门户和 Azure 资源管理 API 对命名空间和所有相关资源进行的管理已使用 Azure RBAC 模型进行了保护。 Azure 提供以下 Azure 内置角色,用于授权访问中继命名空间:

角色 说明
Azure 中继所有者 使用此角色授予对 Azure 中继资源的完全访问权限。
Azure 中继侦听器 使用此角色授予对 Azure 中继资源的侦听和实体读取访问权限。
Azure 中继发送方 使用此角色授予对 Azure 中继资源的发送和实体读取访问权限。

资源范围

向安全主体分配 Azure 角色之前,请确定安全主体应具有的访问权限的范围。 最佳做法规定,始终最好只授予最小的可能范围。

以下列表描述了可以限定 Azure 中继资源访问权限范围的级别,从最窄的范围开始:

  • 中继实体:角色分配应用于某个特定中继实体,例如混合连接或 WCF 中继。
  • 中继命名空间:角色分配应用于该命名空间下的所有中继实体。
  • 资源组:角色分配应用于该资源组下的所有中继资源。
  • 订阅:角色分配应用于该订阅中所有资源组内的所有中继资源。

注意

请记住,Azure 角色分配可能需要最多五分钟的时间进行传播。 有关如何定义内置角色的详细信息,请参阅了解角色定义。 若要了解如何创建 Azure 自定义角色,请参阅 Azure 自定义角色

通过应用进行身份验证

将 Microsoft Entra ID 与 Azure 中继相使用的一个关键优势是,无需再在代码中存储凭据。 可以从 Microsoft 标识平台请求 OAuth 2.0 访问令牌。 Microsoft Entra 对运行应用程序的安全主体(用户、组或服务主体)进行身份验证。 如果身份验证成功,Microsoft Entra ID 会将访问令牌返回给应用程序,应用程序然后可使用访问令牌对 Azure 中继请求授权。

以下部分介绍如何配置控制台应用程序,以便在 Microsoft 标识平台 2.0 中进行身份验证。 有关详细信息,请参阅 Microsoft 标识平台 (v2.0) 概述

有关 OAuth 2.0 代码授权流的概述,请参阅使用 OAuth 2.0 代码授权流来授权访问 Microsoft Entra Web 应用程序

在 Microsoft Entra 租户中注册应用程序

要使用 Microsoft Entra ID 授权访问 Azure 中继实体,第一步是通过 Azure 门户在 Microsoft Entra 租户中注册客户端应用程序。 注册客户端应用程序时,需要向 AD 提供关于应用程序的信息。 Microsoft Entra ID 随后会提供客户端 ID(也称为应用程序 ID)。在运行时,可以使用该 ID 将应用程序与 Microsoft Entra 关联。

有关将应用程序注册到 Microsoft Entra ID 的分步说明,请参阅快速入门:将应用程序注册到 Microsoft Entra ID

重要

记下目录(租户)ID 和应用程序(客户端)ID 。 将需要这些值来运行示例应用程序。

创建客户端机密

请求令牌时,应用程序需要使用客户端机密来证明其身份。 在前面链接的同一篇文章中,请参阅添加客户端密码部分来创建客户端密码。

重要

记下该客户端密码。 你将需要它来运行示例应用程序。

使用 Azure 门户分配 Azure 角色

将其中一个 Azure 中继角色分配给所需范围(中继实体、命名空间、资源组、订阅)中应用程序的服务主体。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

运行示例

  1. GitHub 下载控制台应用程序示例。

  2. 按照 README 文章中的说明在计算机上本地运行应用程序。

    注意

    按照相同步骤运行 WCF 中继的示例控制台应用程序

示例中突出显示的代码

下面是示例中的代码,演示如何使用 Microsoft Entra 身份验证连接到 Azure 中继服务。

  1. 使用 TokenProvider.CreateAzureActiveDirectoryTokenProvider 方法创建 TokenProvider 对象。

    如果尚未创建应用注册,请参阅将应用程序注册到 Microsoft Entra ID 部分进行创建,然后按照创建客户端密码部分所述创建客户端密码。

    如果要使用现有应用注册,请按照这些说明获取应用程序(客户端)ID 和目录(租户)ID 。

    1. 登录 Azure 门户
    2. 在顶部使用搜索栏来搜索“Microsoft Entra ID”并将其选中。
    3. 在“Microsoft Entra ID”页面上,选择左侧菜单的“管理”部分中的“应用注册”。
    4. 选择应用注册。
    5. 在应用注册页上,可以看到“应用程序(客户端) ID”和“目录(租户) ID”的值。

    若要获取客户端密码,请执行下列步骤:

    1. 单击应用注册页左侧菜单中的“证书和机密”

    2. 使用“客户端密码”部分中机密的“值”列中的复制按钮 。

      static TokenProvider GetAadTokenProvider(string clientId, string tenantId, string clientSecret)
      {
          return TokenProvider.CreateAzureActiveDirectoryTokenProvider(
              async (audience, authority, state) =>
              {
                  IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(clientId)
                      .WithAuthority(authority)
                      .WithClientSecret(clientSecret)
                      .Build();
      
                  var authResult = await app.AcquireTokenForClient(new [] { $"{audience}/.default" }).ExecuteAsync();
                  return authResult.AccessToken;
              },
              $"https://login.chinacloudapi.cn/{tenantId}");
      }
      
  2. 通过传递混合连接 URI 和上一步中创建的令牌提供程序来创建 HybridConnectionListenerHybridConnectionClient 对象。

    侦听器:

    var listener = new HybridConnectionListener(hybridConnectionUri, tokenProvider);    
    

    发送方

    var sender = new HybridConnectionClient(hybridConnectionUri, tokenProvider);    
    

示例

后续步骤

若要了解有关 Azure 中继的详细信息,请参阅以下主题。