API 重现
我在 azure 门户中创建了一个简单的 azure 函数应用程序,并使用 http 绑定(bind)函数。函数仅返回字符串“Hello from secure API”。
接下来,在平台功能中,我选择了“身份验证/授权”。我打开了应用服务身份验证。我选择了请求未经过身份验证时要采取的操作:使用 AAD 登录。选择 AAD 作为我的提供商并在快速模式(默认目录)下进行配置,并为新的 Active Directory 应用程序选择了 {name}。
我还添加了 CORS 策略地址: http://localhost:8080 我的 Vue.js 客户端应用程序正在运行。
完成这些操作后,我已在 AAD 中注册了应用程序,并且已经定义了 user_impersonation 范围。 AD 应用程序已经配置了重定向 URI:https://{name}.azurewebsites.net/.auth/login/aad/callback,检查了 Web 平台上隐式授予的 Id token 。我想将支持的帐户类型更改为 Multi-Tenancy ,但由于出现错误而无法更改。
在“公开 Api”部分中,我将 App Id Uri 从 https://{name}.azurewebsites.net 更改为 api://{app id},以便选择 Multi-Tenancy 支持的客户端类型。已经定义了 user_impersonation 范围。
客户重现
我使用重定向 uri 在 Web 平台上注册了我的应用程序 http://localhost:8080/ 并在隐式授予部分选择 id 和访问 token 。我选择了 Multi-Tenancy 帐户类型。
我向我的 API 添加了 api 权限(azure 函数)api://{api app id }/user_impersonation
我在 vue.app 中使用 MSAL.JS。我在那里完成了所有工作。弹出窗口,给出了我的登录名和密码。
我在 vue.js 客户端应用程序中从身份提供商 (AAD) 收到了 ID token 和访问 token 。
我正在使用授权 header Bearer {access_token} 向我的 API(azure 函数)发送请求。
问题
我的 API 请求未经授权。我的状态为 401:
POST https://{azure func name}.azurewebsites.net/api/HttpTrigger1?code={code}== 401 (Unauthorized)
Http 地址是从 Azure 门户复制的。
当我单击链接时,我会被重定向到登录,然后重定向到 azure 函数,并在 brwoser 选项卡中显示“Hello from secure API”文本。
我似乎 Easy auth 将我的 azure 函数视为客户端应用程序,无论我是否希望它成为我的 vue.js 应用程序的中间件 APi。我的 Azure 函数 API 应该只接收和验证访问 token 。
尝试过
我还尝试使用 token 发送来自 postman 的请求,但也收到了未经授权的请求。
我探索了该 token ,它似乎是正确的:
"aud": "api://{Azure function App Id (id in AAD)}",
"iss": "https://sts.windows.net/{tenant id}/",
"appid": "{registered vue js client app id (id in AAD)}",
最佳答案
要解决该问题,我必须转到 Azure Function App 平台功能中的身份验证/授权部分。在“身份验证提供程序”下,选择 AAD -> 高级并添加允许的 token 受众:api://{Azure Function AD App Id }。
问题是我的 token 是供其他受众使用的:https://{func name}.azurewebsites.net
。这是由于更改了我的 AF AD 应用程序 ID:
"In Expose Api section I changed App Id Uri from https://{name}.azurewebsites.net to api://{app id} in order to choose multitenant supported client types. There already has been user_impersonation scope defined."
此操作还更改了范围名称。
关于azure - 使用 AAD 和 Azure Function 的 Easy Auth 隐式流程返回未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61090233/