azure - 从 PowerApp(或逻辑应用)调用受 AAD 保护的 Azure 函数
问题描述
我有一个设置为使用 AAD 身份验证(最新(非经典)方法)的Azure 函数,当我使用 Postman 或自定义连接器时,我无法通过 401 错误。我已关注有关设置自定义连接器的Microsoft Docs文章。
我最初的测试包括以下内容:
- 创建了一个新的 Azure Function App
- 为函数应用设置系统分配的 MSI
- 使用 AzureAD 设置身份验证(经典方法)
- 在 AzureAD 中创建额外的应用程序注册(用于自定义连接器)并执行必要的配置/同意
- 为 PowerApps 创建了一个自定义连接器
- 在自定义连接器中成功测试
虽然这在使用经典身份验证方法配置时有效,但我随后在 Function App 中配置了新方式的身份验证,这导致我的所有请求都返回 401。当我将 Function App 配置为对未经身份验证的请求使用 302 时,我可以进行身份验证带有针对 HTTP 触发函数的浏览器请求。但是,如果我尝试使用 Postman、测试自定义连接器或连接到逻辑应用程序中的函数,我总是会收到 401。所有身份验证配置都显示正确并且用户分配已配置。
我一直在寻找教程或其他配置 PowerApps 连接与安全 Azure 功能的人,但我无法找到我要查找的内容。如果可能的话,我想使用最新的方法来设置身份验证,但如果没有,另一种方法是重新创建函数应用程序并通过经典方法设置身份验证(注意:一旦你配置了新的身份验证方法,你就可以' t 返回并通过经典模式进行设置)。
更新:还想添加一些屏幕截图:
在该Authentication
部分中,我将其设置为Require Authentication(注意:当更改为not require authentication时,api 调用工作正常)。
应用程序公开了user_impersonation
文档中描述的 api(自定义应用程序注册已授权此 api)
自定义应用注册(即连接器应用注册)设置为使用 api 并获得同意。我还生成了一个客户端密码供 Postman 使用。
在 LINQPad 中,我拼凑了一些代码来Access Token
使用连接器应用程序注册。但是,我仍然收到相同的 401 错误。我尝试同时使用主机名和Function app auth app id - 都导致 401。令牌成功返回,但函数调用失败。
更新 #2:解决 PowerApp 自定义连接器问题
在遵循@bowman-zhu 解决方案(/v2.0
从 Issuer URL 中删除)之后,我能够克服 401 错误。我的下一步是再次测试自定义连接器。由于这是最初的痛点,我想提供解决方案的详细信息。
最初,我仍然收到错误消息,因此我决定从Azure Active Directory
身份提供者切换为使用Generic Oauth 2
.
遵循 Microsoft 文档创建自定义连接器后,Client id
和Client secret
是特定于连接器应用程序注册的。和Authorization URL
也Token URL
从应用程序注册中删除(即使它们是 v2.0,它们仍然有效)。我使用了与授权 URL相同的值Refresh URL
。范围是<guid>/.default
(其中是函数应用的授权应用注册的应用 ID)。
在验证和更新连接器后,我测试了其中一个 API 调用,最终一切都按预期工作。
解决方案
更新:
检查您的发行人 URL:
或者将 accessTokenAcceptedVersion 更改为 2:
无论如何,请确保问题 url 版本相同。
(发现Authentication还是有很多问题,很多东西不会自动配置。)
原答案:
这是你遇到的问题:
您需要授权:
例如,如果您使用的是 python,那么:
1、最新的Authentication不会自动暴露你的function app,所以需要添加:
1、创建一个客户端广告app来访问上面的api。
2,使用如下代码获取令牌(客户端ID和秘密是从上面的广告应用程序获取):
import requests
from azure.identity import ClientSecretCredential
import json
client_id = 'xxx'
tenant_id = 'xxx'
client_secret = 'xxx'
subscription_id = 'xxx'
credential = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
print(credential.get_token('https://0416bowman.azurewebsites.net/.default'))
accesstoken = str(credential.get_token('https://0416bowman.azurewebsites.net/.default'))[19:1141]
print(accesstoken)
3、将访问令牌添加到Authorization标头中,如果您使用的是邮递员,您应该这样做:
下面的 url 可以让你检查令牌是否正确:
推荐阅读
- r - 在 keras R 中实现 tmie 系列分类的一维卷积神经网络
- docker - 在 Jenkins 上运行 docker 映像的 $HOME 目录在哪里?
- complex-event-processing - 日志文件源的复杂事件处理
- javascript - 添加或删除行时使用jquery在表中自动计算
- reactjs - 如何在单独的页面 react.js 语义 ui 中包含表单验证
- javascript - 为什么连续的前瞻并不总是有效
- r - 如果它们不是 NA,则将一列粘贴到所有其他列
- omnet++ - 更改 RSU 名称时出错
- php - PHP重命名不起作用
- javascript - 多个 webpack 条目和 chunkFilename