使用托管标识从 Azure Logic 应用向 Azure Function 进行身份验证

Posted

技术标签:

【中文标题】使用托管标识从 Azure Logic 应用向 Azure Function 进行身份验证【英文标题】:Authenticate from Azure Logic app to Azure Function using Managed Identity 【发布时间】:2019-09-08 09:29:30 【问题描述】:

我正在尝试为逻辑应用和 Azure 函数配置安全性。 Azure 函数有一个 HTTP 触发器。到目前为止,我已经完成了以下工作:

    创建了具有一些基本功能的 Azure 函数(在请求中写入查询以记录)。 创建了逻辑应用(循环触发器,HTTP 触发 Azure 函数) 测试逻辑应用成功调用 Azure Function 向逻辑应用添加了托管标识 在 Azure Function App 上启用 Azure AD 身份验证/授权,并使用在 Azure AD 中为 Function App 创建应用注册的快速配置。 在逻辑应用的 HTTP 操作中添加了托管标识作为身份验证方法。

当我运行逻辑应用程序时,它显示 HTTP 操作失败,因为它未经授权。谁能告诉我我错过了什么?我找到了一些关于如何使用类似方法访问 KeyVault(例如)的教程,但对于 Azure 函数却没有。我觉得我需要告诉应用注册逻辑应用的托管标识具有权限,但我不知道这是否正确,也不知道该怎么做。

【问题讨论】:

请看一下这个线程。***.com/questions/55407966/… ..我已经回答了两种可能的方法,其中第二种更具声明性。此外,在尝试从 Logic App 进行身份验证时,请确保在 HTTP Action for Logic App 中输入正确的受众值(它应该是 Azure Function 的 Azure AD 应用注册中的 APP ID URI。您可以找到 APP ID URI来自门户网站..i.stack.imgur.com/rqvUG.png) 嗨@RohitSaigal 感谢您的回复。在清单内的 JSON 中,id 应该输入什么值(你有 fc80341...)? 不客气。它可以是任何唯一的 GUID。你可以创建一个新的。你基本上是在定义一个新角色并给它一个标识符。 【参考方案1】:

首先,要克服逻辑应用调用 Azure 函数时当前遇到的未经授权的错误,您需要确保逻辑应用正在获取令牌以正确地对函数进行身份验证。

我很快试用了一个具有托管标识的逻辑应用,例如您的设置,以调用启用了 Azure AD 身份验证的 Azure 函数。以下是要遵循的详细步骤。

    在您的逻辑应用中添加一个 HTTP 操作,用于调用您的 Azure 函数 就我而言,这是一个简单的 GET 调用,其 URL 类似于 https://<myfunctionapp>.azurewebsites.net/api/simplefunction 在身份验证中选择Managed Identity

    然后添加新参数并选中Audience复选框

    Audience 参数的值更改为函数应用的 Azure AD 应用注册的 APP ID URI。在我的例子中,这个值看起来像 https://<myazureadtenant>.onmicrosoft.com/GUID

    您可以从 Azure 门户 > Azure AD > 应用注册 > 函数应用注册 > 设置 > 属性中找到此 APP ID URI 值

此时,您应该能够测试您的逻辑应用并至少可以正常调用 Azure 函数(除非您的 Azure 函数仅限于某些调用者或需要特定权限,稍后会详细介绍。)

在我的例子中,完整的 HTTP 操作如下所示。

接下来,一旦从逻辑应用(使用托管标识)到您的 Azure 函数的基本调用得到正确身份验证,问题是任何应用程序都应该能够调用您的 Azure 函数,还是只允许某些具有特定权限的调用者。

我在这篇 SO 帖子 - Is there a way to secure an Azure Function that will only be called from a specific Azure Logic App? 中用 2 种方法详细回答了这一部分。该答案中的第二种方法是非常声明性的,如果您的函数需要,您甚至可以为不同类型的调用者创建多个不同的应用程序角色。

【讨论】:

感谢 Rohit,但我仍然遇到问题。按照您的说明进行操作后,我检查了从匿名浏览器会话访问我的 AZ 功能,我仍然可以访问它。还使用我的逻辑应用程序进行了测试,它也访问了该功能。然后我将 AZ 函数集成授权级别更改为函数(匿名)。我不再能够使用匿名 Web 会话或从 Logic App 中访问该功能。逻辑应用现在再次失败,显示未经授权。有什么建议吗?

以上是关于使用托管标识从 Azure Logic 应用向 Azure Function 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

通过托管标识从 c# Azure 函数检索配置值的 Azure 应用程序配置不起作用

Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为啥?

如何查找 Active Directory OAuth 身份验证的受众字段? (如何从 Azure Logic App 向 DevOps 发送发布请求?)

为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?

是否可以使用托管标识从 C# 控制台代码连接 Azure 文件共享(存储帐户)

将 Azure 托管标识用于部署到 Azure 的应用程序?