适用范围:Azure 逻辑应用(消耗型 + 标准型)
要运行在逻辑应用工作流中执行特定作业的代码,不必生成完整的应用或基础结构。 相反,可以创建并调用 Azure 函数。 Azure Functions 提供云无服务器计算和执行以下任务的功能:
- 通过运行使用 Node.js 或 C# 创建的函数来扩展工作流的行为。
- 在工作流中执行计算。
- 在工作流中应用高级格式设置或计算字段。
本操作指南演示如何从消耗型或标准工作流调用现有 Azure 函数。 要在不使用 Azure Functions 的情况下运行代码,请参阅以下文档:
限制
- 只有消耗工作流支持使用托管标识和 Microsoft Entra 身份验证对 Azure 函数调用进行身份验证。 有关如何为函数调用启用身份验证的部分当前不支持标准工作流。 
- Azure 逻辑应用不支持在启用了部署槽位的情况下使用 Azure Functions。 虽然此方案有时可能可行,但此行为是不可预测的,且在工作流尝试调用 Azure 函数时可能会导致授权问题。 
先决条件
- Azure 帐户和订阅。 如果没有订阅,可以注册 Azure 帐户。 
- Azure 函数应用资源,其中包含一个或多个 Azure 函数。 - 函数应用资源和逻辑应用资源必须使用相同的 Azure 订阅。 
- 函数应用资源必须使用 .NET 或 Node.js 作为运行时堆栈。 
- 向函数应用添加新函数时,可以选择 C# 或 JavaScript。 
 
- 要调用的 Azure 函数。 可使用以下工具创建此函数: 
- 函数必须使用 HTTP 触发器模板。 - 此 HTTP 触发器模板可从逻辑应用工作流接受具有 类型的内容 - application/json。 当你向工作流添加函数时,设计器会显示 Azure 订阅内基于此模板创建的自定义函数。
- 函数代码必须包含要在函数完成后返回到工作流的响应和有效负载。 - context对象是指工作流通过本指南后面的名为“请求正文”的 Azure Functions 操作参数发送的消息。- 本指南使用名为 FabrikamAzureFunction 的以下示例函数: - module.exports = function (context, data) { var input = data; // Function processing logic // Function response for later use context.res = { body: { content:"Thank you for your feedback: " + input } }; context.done(); }- 要从函数内访问 - context对象的属性,请使用以下语法:- context.body.<property-name>- 例如,要引用 - content对象内的- context属性,请使用以下语法:- context.body.content- 此代码还包含一个 - input变量,此变量存储来自- data参数的值,因此函数可对该值执行操作。 在 JavaScript 函数内,- data变量也是- context.body的一种快捷方式。- 注意 - 此处的 - body属性适用于- context对象,但与来自操作输出的 Body 令牌不同,后者也可以传递到函数。
- 你的函数无法使用自定义路由,除非你定义了 OpenAPI 定义。 - 如果已经有函数的 OpenAPI 定义,工作流设计器会提供更丰富的函数参数使用体验。 在工作流查找并访问具有 OpenAPI 定义的函数之前,请先按以下步骤设置函数应用。 
 
- 以任何触发器开始的消耗型或标准逻辑应用工作流。 - 本指南中的示例使用名为“收到新电子邮件时”的 Office 365 Outlook 触发器。 
- 要创建和调用调用另一个工作流的 Azure 函数,请确保辅助工作流以提供可调用终结点的触发器开始。 - 例如,可使用常规 HTTP 或“请求”触发器启动工作流,也可使用基于服务的触发器,例如 Azure 队列或事件网格。 在函数内,向触发器的 URL 发送一个 HTTP POST 请求,并加入需要辅助工作流处理的有效负载。 有关详细信息,请参阅调用、触发器或嵌套逻辑应用工作流。 
有关使用 Azure 函数的提示
使用 OpenAPI 定义查找函数
要设置函数应用以使工作流可查找和使用具备 OpenAPI 定义的函数,请按照以下步骤操作:
- 在 Azure 门户中,打开函数应用。 确保函数应用正在运行。 
- 在函数应用中,按照以下步骤操作来设置跨源资源共享 (CORS),以便允许所有源: 
访问 HTTP 请求中的属性值
基于 Webhook 的函数可以接受 HTTP 请求作为输入,并将这些请求传递至其他函数。 例如,尽管 Azure 逻辑应用具有转换 DateTime 值的函数,但此基本示例 JavaScript 函数演示了如何访问传递给函数的 HTTP 请求对象中的属性,并对该属性值执行操作。 为访问对象内的属性,此示例使用点 (.) 运算符:
function convertToDateString(request, response){
   var data = request.body;
   response = {
      body: data.date.ToDateString();
   }
}
下面是此函数内部发生的情况:
- 该函数创建 - data变量并将- body对象内的- request对象分配给该变量。 该函数使用点 (.) 运算符引用 对象内的- body对象- request:- var data = request.body;
- 该函数现在可以通过 - date变量访问- data属性,并通过调用 函数将该属性值从 DateTime 类型转换为 DateString 类型- ToDateString()。 该函数还通过函数响应中的- body属性返回结果:- body: data.date.ToDateString();
在 Azure 中创建函数后,请按照将 Azure 函数添加到工作流的步骤操作。
将 URI 参数传递给函数
如果必须向函数传递 URI 参数,则可以在函数的终结点 URL 中使用查询参数。
- 在逻辑应用的工作流设计器打开并且函数信息窗格打开时,从“高级参数”列表中选择“查询”。 - 此时会显示一个表,你可在其中输入参数输入作为键值对。 
- 输入参数的键值对,例如:   
将函数添加到工作流(消耗型 + 标准工作流)
要从工作流调用 Azure 函数,可以添加该函数,具体方法与在设计器中执行的任何其他操作一样。
- 在 Azure 门户中,打开设计器中的消耗逻辑应用工作流。 
- 在设计器中,按照这些常规步骤添加名为“选择 Azure 函数”的 Azure Functions 操作。 
- 在“添加操作”窗格中,执行以下步骤: - 从函数应用列表中选择你的函数应用,选择函数,然后选择“添加操作”,例如:   
 
- 显示函数的信息框后,请执行以下步骤: - 在“请求正文”中,提供函数的输入,其格式必须为 JavaScript 对象表示法 (JSON) 对象的格式,例如: - {"context": <selected-input> }- 此输入是工作流发送到函数的上下文对象有效负载或消息。 - 要选择表示前面步骤的输出的令牌,请在“请求正文”框内选择,然后选择打开动态内容列表(闪电图标)的选项。 
- 要创建表达式,请在“请求正文”框内选择,然后选择打开表达式编辑器(公式图标)的选项。 
 - 以下示例列举了一个 JSON 对象,该对象具有 - content属性和一个将电子邮件触发器的“From”输出表示为“请求正文”值的令牌:  - 此处的上下文对象没有强制转换为字符串,因此对象的内容被直接添加到 JSON 有效负载中。 以下是完整示例:   - 如果提供的上下文对象不是传递字符串、JSON 对象或 JSON 数组的 JSON 令牌,则会出现错误。 但可通过将令牌括在引号 ("") 中来将上下文对象转换为字符串,例如,如果想要使用“Received Time”令牌:   
- 要指定其他详细信息(如要使用的方法、请求头、查询参数或身份验证),请打开“高级参数”列表,然后选择所需的参数。 身份验证的选项因所选函数而异。 有关详细信息,请参阅为函数启用身份验证。 
 
为 Azure 函数调用启用身份验证(仅限消耗型工作流)
消耗型工作流可以使用托管标识对 Azure 函数调用进行身份验证,并访问受 Microsoft Entra ID 保护的资源。 此托管标识无需登录并提供凭据或机密即可对访问进行身份验证。 由于无需提供或轮换机密,因此 Azure 会为你管理此标识,并且会帮助保护凭据。 可以在逻辑应用资源级别设置系统分配的标识或手动创建、用户分配的标识。 从工作流调用的 Azure 函数可以使用同一托管标识进行身份验证。
注意
只有消耗型工作流支持使用托管标识和 Microsoft Entra 身份验证对 Azure 函数调用进行身份验证。 使用操作调用 Azure 函数时,标准工作流当前不包括此支持。
有关详细信息,请参阅以下文档:
若要设置函数应用和函数,以便它们可以使用消耗型逻辑应用的托管标识,请执行以下高级步骤:
设置函数以进行匿名身份验证(仅限消耗型工作流)
若要让函数使用消耗型逻辑应用的托管标识,则必须将函数的身份验证级别设置为“anonymous”。 否则,工作流会抛出 BadRequest 错误。
- 在 Azure 门户中,找到并选择你的函数应用。 - 以下步骤使用名为 FabrikamFunctionApp 的示例函数应用。 
- 在函数应用资源菜单的“开发工具”下,选择“高级工具”“前往”。 
- 在“Kudu Plus”页打开后,在 Kudu 网站的标题栏中,从“调试控制台”菜单中选择“CMD”。 
- 下一页出现后,从文件夹列表中选择“站点”“wwwroot”>“<你的函数>”。 - 以下步骤使用名为 FabrikamAzureFunction 的示例函数。 
- 打开 function.json 文件以进行编辑。 
- 在 bindings 对象中,检查 authLevel 属性是否存在。 若有此属性,将属性值设置为“ - anonymous”。 否则,请添加此属性并设置值。
- 完成后,保存设置。 请继续阅读下一节。 
查找设置 Microsoft Entra 身份验证所需的值(仅限消耗工作流)
在设置函数应用以使用托管标识和 Microsoft Entra 身份验证之前,需要按照本节中的步骤查找并保存以下值。
查找 Microsoft Entra 租户的租户 ID
运行名为 Get-AzureAccount 的 PowerShell 命令,或在 Azure 门户中执行以下步骤:
- 在 Azure 门户中,打开 Microsoft Entra 租户。 - 本指南使用“Fabrikam”作为示例租户。 
- 在租户菜单中,选择“概述”。 
- 复制并保存租户 ID 供以后使用,例如: 
查找托管标识的对象 ID
为消耗型逻辑应用资源启用托管标识后,找到托管标识的对象。 使用此 ID 在 Entra 租户中找到关联的 Enterprise 应用程序。
查找与托管标识关联的 Azure Enterprise 应用程序的应用程序 ID
在逻辑应用资源上启用托管标识时,Azure 会自动创建具有相同名称的关联 Azure Enterprise 应用程序。 现在需要找到关联的 Enterprise 应用程序,并复制其“应用程序 ID”。 然后,使用此应用程序 ID 创建应用注册,为函数应用添加标识提供者。
- 在 Azure 门户中,找到并打开 Entra 租户。 
- 在租户菜单中的“管理”下,选择“Enterprise 应用程序”。 
- 在“所有应用程序”页上的搜索框中,输入托管标识的对象 ID。 在结果中,找到匹配的企业应用程序,并复制“应用程序 ID”: 
- 现在,使用复制的应用程序 ID 向函数应用添加标识提供者。 
为函数应用添加标识提供者(仅限消耗型工作流)
拥有租户 ID 和应用程序 ID 后,可以通过添加标识提供者和创建应用注册,来设置函数应用以使用 Microsoft Entra 身份验证。
- 在 Azure 门户中,打开函数应用。 
- 在函数应用菜单的“设置”下,选择“身份验证”,然后选择“添加标识提供者”。 
- 在“添加标识提供者”窗格的“基本信息”下,从“标识提供者”列表中选择“Microsoft”。 
- 在“应用注册”下,对于“应用注册类型”,选择“提供现有应用注册的详细信息”,然后输入之前保存的值。 - 属性 - 需要 - 值 - 描述 - 应用程序(客户端) ID - 是 - < application-ID> - 用于此应用注册的唯一标识符。 对于此示例,使用为 Enterprise 应用程序复制的应用程序 ID,该应用程序与托管标识相关联。 - 客户端密码 - 可选,但建议提供 - < client-secret> - 应用在请求令牌时用来证明其身份的机密值。 客户端机密作为名为 MICROSOFT_PROVIDER_AUTHENTICATION_SECRET 的槽粘滞应用程序设置创建并存储在应用的配置中。 
 - 确保定期轮换并安全地存储机密。 例如,在 Azure 密钥保管库中管理机密,可以在其中使用托管标识来检索密钥,而不会将值透露给未经授权的用户。 可以更新此设置以使用密钥保管库引用。
 - 如果提供客户端机密值,登录操作将使用混合流,同时返回访问令牌和刷新令牌。
 - 如果未提供客户端机密,登录操作将使用 OAuth 2.0 隐式授权流。 此方法仅直接返回 ID 令牌或访问令牌。 这些令牌由提供程序发送并存储在 EasyAuth 令牌存储中。
 重要说明:由于存在安全风险,隐式授权流不再是一种合适的身份验证方法。 应改用授权代码流和用于代码交换的证明密钥 (PKCE) 或单页应用程序 (SPA) 授权代码。- 颁发者 URL - 否 - < authentication-endpoint-URL>/<Entra-tenant-ID>/v2.0 - 此 URL 会将用户重定向到正确的 Microsoft Entra 租户,并下载适当的元数据,以便确定相应的令牌签名密钥和令牌颁发者声明值。 对于使用 Azure AD v1 的应用,请省略 URL 中的 /v2.0。 
 在此示例中,请使用以下 URL:- https://sts.chinacloudapi.cn/<Entra-tenant-ID>- 允许的令牌受众 - 否 - <application-ID-URI> - 函数应用的应用 ID URI(资源 ID)。 对于你希望允许使用 Web 应用中的身份验证令牌的云应用或服务器应用,请在此处添加 Web 应用的应用 ID URI。 配置的客户端 ID 始终被隐式地视为允许的受众。 
 在此方案中,值为- https://management.chinacloudapi.cn。 稍后,在工作流中将函数操作设置为使用托管标识时,可以在“受众”属性中使用相同的 URI。
 重要提示:此应用程序 ID URI(资源 ID)与 Microsoft Entra ID 所需的值必须完全匹配,包括所有必要的尾部斜杠。- 现在,你的版本如以下示例所示: - 如果你是首次使用标识提供者设置函数应用,则还会显示“应用服务身份验证设置”部分。 这些选项可确定函数应用如何响应未经身份验证的请求。 默认选择将重定向所有使用新标识提供者登录的请求。 现在可以自定义此行为,也可以稍后通过选择“身份验证”设置旁边的“编辑”,在主“身份验证”页调整这些设置。 若要详细了解这些选项,请查看身份验证流 - Azure 应用服务和 Azure Functions 中的身份验证和授权。 - 否则,可以继续执行下一步。 
- 若要完成创建应用注册的过程,请选择“添加”。 - 完成后,“身份验证”页现在会列出标识提供者和应用注册的应用程序(客户端 ID)。 函数应用现在可以使用此应用注册进行身份验证。 
- 复制应用注册的“应用(客户端)ID”,以便稍后在工作流的 Azure Functions 操作的“受众”属性中使用。 
- 返回到设计器,并使用内置的 Azure Functions 操作,按照使用托管标识验证访问权限的步骤操作。 
 
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
              