【问题标题】:Accessing AD secured Azure Function via AJAX通过 AJAX 访问 AD 保护的 Azure Function
【发布时间】:2020-05-23 02:01:05
【问题描述】:

我有一个带有 Web 触发器端点的 Azure 函数设置,我想将其用作 React 应用程序的后端。没有身份验证设置,它工作正常。当我使用 AD 设置应用服务身份验证时,当我直接通过浏览器访问(身份验证后)时它工作正常,但是当我尝试从提供承载令牌的 JS 访问时,我得到一个 401。

const response = await axios.get(`${window.apiUrl}api/jobs`, {
    headers: {
      'Content-Type': 'application/json',
      Authorization: 'Bearer ' + token.accessToken,
    },
  });

客户端应用程序在 Azure 上运行并注册为 Azure AD 应用程序。我能够成功地进行身份验证、查询 AD 和使用 MS Graph API。

我正在使用内置的 Azure 应用服务 AD 身份验证。我将客户端 ID 设置为与前面提到的 Azure AD 应用程序相同的客户端 ID,以及相同的颁发者 URL。

尝试获取会话令牌:

const accessToken = await authProvider.getAccessToken();
const idToken = await authProvider.getIdToken();
const login = await axios.post(
  'https://<appname>.azurewebsites.net/.auth/login/aad',
    { access_token: accessToken.accessToken },
    {
      headers: {
        'Content-Type': 'application/json',
      },
    },
  );

更多信息

我的 aud 声明是 00000003-0000-0000-c000-000000000000。在 Azure 门户中,我的 Azure Function 配置为使用与我的 SPA 相同的 Azure AD 应用程序。我在我的 SPA 中使用 MSAL.js 进行身份验证。我正在请求 User.Read 和 Directory.Read.All 范围。

【问题讨论】:

  • 需要更多信息。这里有一些东西要收集。 1)您可以将访问令牌粘贴到jwt.ms 中,然后查看“aud”声明。你能把这些信息贴在这里吗? 2) 您在身份验证/授权刀片上的配置 - 您已为特定 App ID 配置 3) 您在 SPA 中使用什么 - 是 ADAL.js 还是 MSAL.js 4) 在您的 SPA 中您的范围列表是什么您正在请求。
  • @SaeedAkhter 请求的信息已添加到 OP。

标签: azure azure-active-directory azure-functions


【解决方案1】:

Microsoft 发布了一篇名为 Advanced usage of authentication and authorization in Azure App Service 的操作指南文章。在the section on validating tokens from providers 中,它说:

在客户端导向的登录中,应用程序将用户登录到 提供者手动提交认证令牌给 App 验证服务(请参阅Authentication flow)。本次验证 它本身实际上并没有授予您访问所需应用程序资源的权限, 但是成功的验证会给你一个会话令牌,你可以 用于访问应用资源。

所以你需要获取会话令牌才能访问应用资源。

请求:

POST https://<appname>.azurewebsites.net/.auth/login/aad HTTP/1.1
Content-Type: application/json

{"id_token":"<token>","access_token":"<token>"}

回应:

{
    "authenticationToken": "...",
    "user": {
        "userId": "sid:..."
    }
}

获得此会话令牌(authenticationToken)后,您可以通过在 HTTP 请求中添加 X-ZUMO-AUTH 标头来访问受保护的应用资源

GET https://<appname>.azurewebsites.net/api/products/1
X-ZUMO-AUTH: <authenticationToken_value>

【讨论】:

  • 我正在使用 MSAL 在我的客户端中处理身份验证,并且我正尝试按照您的建议访问登录网站,但不断收到 401。请参阅 OP 中的代码。
  • 更新:App Services 团队已更正了我 - 虽然使用 Bearer 令牌是 SPA 调用函数的推荐模式,但它们还支持称为客户端导向的“登录”流程(或有时是“SDK 登录”),它起源于一个名为 Azure 移动服务(又名“Zumo”)的旧产品。它不依赖于 cookie,它只是使用特定于应用程序的密钥返回它自己的身份验证 JWT“会话令牌”。然后,客户端可以通过发送 in x-z​​umo-auth 请求标头来使用此 JWT 进行经过身份验证的 API 调用。
【解决方案2】:

您不能为 Microsoft Graph 请求令牌并使用它来调用您自己的 API。受众“00000003-0000-0000-c000-000000000000”表示“适用于 Microsoft Graph”。

在 MSAL 中,当您请求令牌时,您需要调整范围。删除 User.Read,删除 Directory.Read.All 并在其末尾添加带有 /.default 的“应用程序 ID URI”。可以在 portal.azure.com 上应用程序注册的“公开 API”刀片中找到应用程序 ID URI。示例:https://SaeedApp/.default

如果您需要同时执行这两项操作,则一次只能为一个资源请求访问令牌。但是,您可以为一个资源请求任意多个范围(User.Read 和 Directory.Read.All 都是同一资源的范围)。

因此,您需要发出两组请求: 1) 获取具有 Microsoft Graph 所需的所有范围的访问令牌 2) 获取包含 API 所需的所有范围的访问令牌

背后的原因:如果我可以获取一个用于您的 API 的访问令牌并使用它调用 Microsoft Graph,那么这将引发“重放”攻击,其中一个资源 API 被黑客入侵,而控制一个资源的黑客可以现在回复它从客户端收到的所有其他资源 API 的访问令牌。

【讨论】:

  • 如果我需要两者都做怎么办?我正在使用 Microsoft Graph 来查询有关用户的信息。这就是为什么我有 User.Read 和 Directory.Read.All。我认为我需要保留那些,否则我不希望它们起作用。
  • 我从公开 API 刀片中添加了新范围。它采用不同的格式:以 api:// 而不是 https:// 开头。但是,当我添加带有 /.default 前缀的新范围时,我的 JS 控制台中出现了一个新错误:不安全的 JavaScript 尝试从带有 URL '' 的框架启动具有源 'localhost:3000' 的框架的导航。顶层窗口尝试导航的框架被沙盒化,但未设置“allow-top-navigation”或“allow-top-navigation-by-user-activation”标志。
  • 要检查的两个想法:1) 仔细检查您用于 SPA 的重定向 URI 是否已在您的应用注册中注册。 2) 这是帧的顶部还是您尝试从 iframe 内部调用 MSAL?
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2015-04-01
  • 2020-10-10
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多