在 Azure 数据工厂中使用服务主体/应用进行 OAuth2 身份验证

时间:2021-03-11 10:37:01

标签: azure azure-active-directory azure-data-factory

我们的目标是从 Azure 管理 API 收集数据。这些 API 提供有关我们在 Azure 中运行的资源、消耗的预算等的信息(example)。根据我们的设计选择,我们更喜欢专门使用 Azure 数据工厂来发出 HTTP 请求并将数据存储到我们的数据湖中。这很明显,使用 REST 链接服务。 但是,我们很难使用这种方法正确设置 OAuth2 身份验证。

  1. 我们的第一个想法是将令牌和刷新令牌存储在 Azure Key Vault 中。然后,管道内的一系列 HTTP 请求将测试令牌是否仍然有效,或者以其他方式使用刷新令牌来获取新令牌。这种方法的缺点是 Azure Key Vault 中的令牌永远不会在需要时更新,并且逻辑变得更加复杂。

  2. 或者,我们尝试通过注册应用程序和服务主体的组合来设置对我们 Azure AD 帐户的授权。可以使用服务主体创建数据工厂中的 REST 链接服务,然后该服务主体将处理范围和许可的大部分信息。服务主体还附带一个 Azure 应用程序,该应用程序将保存令牌等。不幸的是,我们无法正确执行此设置功能。<​​/p>

我们的问题:

  • 我们真的可以使用服务主体/应用程序来存储我们的 OAuth2 令牌吗?如果是这样,这些内容会在我们的应用中自动刷新吗?

  • 我们如何为我们的应用分配正确的权限/授权以使其可以使用此(外部)API?

  • 更新令牌是否需要在 Azure 数据工厂管道中使用 HTTP 调用的附加逻辑,或者这些应用程序/服务主体是否可以处理此问题?

感谢您的时间和帮助!

View of the REST linked service within Azure Data Factory

View of a registered app within Azure

1 个答案:

答案 0 :(得分:1)

将令牌存储在密钥库中不是一个好主意,因为它们会过期。

就您而言,有两个选项供您使用。

  1. 使用服务主体进行身份验证

  2. 使用托管身份进行身份验证(最佳实践)

使用服务主体进行身份验证的步骤:

1.Register an application with Azure AD and create a service principal.

2.Get values for signing increate a new application secret.

3.调用 Azure REST API 例如Resources - List 您提到过,您的服务主体在您的订阅中需要 RBAC 角色。

导航到 Azure 门户 -> Subscription -> 将您的服务主体添加为订阅中的 Contributor/Owner 角色,如下所示。

enter image description here

4.在链接的服务中,像下面一样配置它,用第2步得到的值修复它们。

enter image description here

不要忘记替换 {subscriptionId} 中的 Base URL

https://management.azure.com/subscriptions/{subscriptionId}/resources?api-version=2020-06-01

5.使用复制活动测试链接的服务,它工作正常。

enter image description here

使用托管身份进行身份验证的步骤:

1.确保您的数据工厂有 enabled the MSI(managed identity),如果您在门户或 powershell 中创建它,MSI 将自动启用,不用担心。

2.导航到门户中的 Subsctiption,像 Steps to use service principal to auth 中的第 3 步那样将角色添加到 MSI,只需在栏中搜索您的 ADF 名称,MSI 本质上是一个具有相同名称的服务主体由 azure 管理的 ADF。

3.然后在链接的服务中,像下面一样改变它。

enter image description here


最后,回答你的问题。

<块引用>

我们真的可以使用服务主体/应用程序来存储我们的 OAuth2 令牌吗?如果是这样,这些内容会在我们的应用中自动刷新吗?

正如我所提到的,这不是一个好主意,只需像上述步骤一样使用服务主体/MSI 进行身份验证。

<块引用>

我们如何为我们的应用分配正确的权限/授权以使其可以使用此(外部)API?

要使用 Azure REST API,只需像上面一样分配 RBAC 角色,指定正确的 AAD resource,例如https://management.azure.com 在这种情况下。

<块引用>

更新令牌是否需要在 Azure 数据工厂管道中使用 HTTP 调用的附加逻辑,或者这些应用程序/服务主体是否可以处理此问题?

其他步骤不需要,当你使用上面的配置时,本质上它会使用client credential flow在后台自动为你获取token,然后使用token调用API。