当客户端在 /.auth/login/aad 端点上发布访问令牌时,为啥 EasyAuth 返回 401 Unauthorized 状态?
Posted
技术标签:
【中文标题】当客户端在 /.auth/login/aad 端点上发布访问令牌时,为啥 EasyAuth 返回 401 Unauthorized 状态?【英文标题】:Why is EasyAuth returning a 401 Unauthorized status when a client post an access token on /.auth/login/aad endpoint?当客户端在 /.auth/login/aad 端点上发布访问令牌时,为什么 EasyAuth 返回 401 Unauthorized 状态? 【发布时间】:2019-09-12 01:19:56 【问题描述】:我开始将我的 Live SDK 注册应用程序迁移到新的应用程序注册门户,因为 Microsoft 正在弃用它们的支持:
我进入 Azure 门户中的应用注册(预览)页面并选择创建一个新应用程序。
然后,我去我的Function App的Authentication / Authorization
页面,放了新注册的AAD应用的信息。
我的客户端 ios 应用程序首先从这些端点获取 authorization code
,然后是有效的 access token
:
https://login.microsoftonline.com/<tenantId>/oauth2/v2.0/authorize
https://login.microsoftonline.com/<tenantId>/oauth2/v2.0/token
有了access token
,iOS 应用程序试图POST
AAD 端点(/.auth/login/aad
) 上的令牌,但它失败了。
但是,如果我使用 google 帐户获得 authorization code
和 access token
,然后通过 POST
将 access token
发送到 /.auth/login/google
端点,它就会成功。
问题
当客户端在/.auth/login/aad
端点上发布access token
时,为什么EasyAuth 返回401 Unauthorized
状态?
更新
我现在可以从该令牌端点https://login.microsoftonline.com/<tenantId>/oauth2/v2.0/token
检索访问令牌,并使用Insomnia
/ Postman
到POST
将以下对象application/json
用于/.auth/login/aad
端点:
"access_token": "eY...."
我收到的回复是 401 Unauthorized
,其中包含以下消息:
You do not have the permission to view this directory or page.
我遵循与 Google 帐户完全相同的程序。我还确保我的注册应用程序允许来自我的 Azure Active Directory 的用户以及个人帐户。以下是这些设置的屏幕截图:
【问题讨论】:
【参考方案1】:简短回答:您应该使用“Azure Active Directory”身份验证提供程序,然后在两个地方正确配置详细信息,A) 您的函数应用程序和 B) Azure AD 应用程序注册。
详细步骤
我尝试通过 App Registrations(预览版)创建一个简单的 Azure AD Authenticated Azure Function,并使用 App Registration。以下是我遵循的详细步骤。
A) Function App 的配置步骤
在 Azure 门户中导航到您的函数应用 > 平台功能 > 身份验证/授权
从身份验证提供程序中选择 Azure Active Directory。在配置页面选择“高级”作为管理模式。
ClientID - 从您的 Azure AD 应用注册中获取应用程序 ID
IssuerURL - https://sts.windows.net/<your Azure AD Tenant ID>/
允许的令牌受众 - https://<yourfunctionappname>.azurewebsites.net/.auth/login/aad/callback
客户端密钥(可选)- 仅与 Web 应用程序相关。再次从您的 Azure AD 应用注册中选择密钥/秘密值。
B) Azure AD 应用注册的配置步骤
导航到 Azure AD > 应用注册(预览版)> 您现有的应用注册 > 概述 >
点击 Redirect URIs 并添加我们在上面的 Allowed Token Audience 中添加的值。
https://<yourfunctionappname>.azurewebsites.net/.auth/login/aad/callback
导航到 Azure AD > 应用注册(预览版)> 您现有的应用注册 > 清单 > 编辑和设置
"oauth2AllowIdTokenImplicitFlow": true
【讨论】:
我这边缺少最后一步 (B) 2.),但我仍然收到401 Unauthorized
响应。
ok 有道理@Kzrystof .. 我还注意到的另一件事是您的Action to take when request is not authenticated
设置为允许匿名访问.. 这是故意的吗?此外,您的 Azure 函数是否有任何简单的 GET 端点?我问是因为您可以通过首先点击该端点来直接在浏览器中进行测试,以查看在尝试从 iOS 设备客户端执行之前访问该功能是否有效。
我会尝试直接戳服务,并尽快查看发生了什么。
我确实戳了一下刚刚打印 ClaimsPrincipal 的 GET 函数,它可以工作。但是,我无法从 /.auth/login/aad 端点获取该授权令牌...【参考方案2】:
您应该选择 Azure Active Directory 作为提供程序,而不是 Microsoft。然后,选择“管理模式”为“高级”,并添加注册应用的App ID。
这里有一篇很好的博客文章解释了这个过程:https://www.c-sharpcorner.com/article/secure-azure-function-with-azure-ad/
另见:Azure Function authentication using Azure Active Directory
【讨论】:
我想我已经完成了所有需要的工作,但是我仍然得到一个未经授权的状态代码。 我在另一篇文章中看到,这有时可能是“身份验证/授权”标头的问题,有时需要禁用它才能接收请求。你见过吗? 带有不记名令牌的授权标头?我实际上在调用 /.auth/login/aad 之前添加了它,但它没有改变任何东西......所以我删除了它。以上是关于当客户端在 /.auth/login/aad 端点上发布访问令牌时,为啥 EasyAuth 返回 401 Unauthorized 状态?的主要内容,如果未能解决你的问题,请参考以下文章
C ++中的远程过程调用(RPC):当端点被硬编码时,多个客户端可以监听一个服务器吗?
.NET 4.5 SMTP 客户端点填充问题,当传送到取件目录时
Asp.net 6 授权。我有能力向客户端发送 JWT,但是当我尝试访问我的端点时,我得到 401。非常困惑
Spring Cloud Config:当调用执行器/刷新端点时,密码未在 Spring Cloud 配置客户端中使用 jasypt 解密