当客户端在 /.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 codeaccess token,然后通过 POSTaccess token 发送到 /.auth/login/google 端点,它就会成功。

问题

当客户端在/.auth/login/aad 端点上发布access token 时,为什么EasyAuth 返回401 Unauthorized 状态?

更新

我现在可以从该令牌端点https://login.microsoftonline.com/&lt;tenantId&gt;/oauth2/v2.0/token 检索访问令牌,并使用Insomnia / PostmanPOST 将以下对象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/&lt;your Azure AD Tenant ID&gt;/

    允许的令牌受众 - https://&lt;yourfunctionappname&gt;.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 状态?的主要内容,如果未能解决你的问题,请参考以下文章

当客户端连接到 WCF 托管的端点时触发事件

C ++中的远程过程调用(RPC):当端点被硬编码时,多个客户端可以监听一个服务器吗?

.NET 4.5 SMTP 客户端点填充问题,当传送到取件目录时

Asp.net 6 授权。我有能力向客户端发送 JWT,但是当我尝试访问我的端点时,我得到 401。非常困惑

Spring Cloud Config:当调用执行器/刷新端点时,密码未在 Spring Cloud 配置客户端中使用 jasypt 解密

更改 Woocommerce 结帐端点以显示订单摘要详细信息