【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误

简介: 【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误

问题描述

在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端的文档中操作 “在开发人员门户中启用 OAuth 2.0 用户授权” 和 “从开发人员门户成功调用 API” 两步后,非常重要的一步就是在API中配置JWT验证策略 - “配置 JWT 验证策略,对请求进行预授权”。 当在API中配置JWT Policy时,如以下内容:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.partner.microsoftonline.cn/{aad-tenant}/v2.0/.well-known/openid-configuration" />
    <required-claims>
        <claim name="aud">
            <value>xxxxxxxx-xxxx-xxxx-xxxx-d322750988cb</value>
        </claim>
    </required-claims>
</validate-jwt>

其中虽然携带了正确的Authorization Token,但是依旧还是会遇见 “IDX10205: Issuer validation failed. Issuer: 'https://sts.chinacloudapi.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/'. Did not match: validationParameters.ValidIssuer: '' or validationParameters.ValidIssuers: 'https://login.partner.microsoftonline.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0'." 错误。

 

问题原因

报错的原因是policy中openid-config url 使用的时OAuth 2.0 的 V2.0 版本而导致的。

通过对比Openid-Configuration内容,就能发现其中的不同之处:

解析AAD所生成的Token值,就可以明确发现使用的是V1颁发。 解析Token可以使用在线工具:https://jwt.io/. 如:

 

所以,解决以上问题,可以有两种办法:

办法一:修改JWT Policy中设置 openid-config.  改为使用V1的终结点

 

办法二:修改Azure AD中注册应用的 accessTokenAcceptedVersion 为2

在Azure AD的应用注册页面的清单中(Manifest)修改 accessTokenAcceptedVersion的值,从null变为2.

{
    "id": "79448457-d7a9-4b27-be7b-f70fd311e45f",
    "acceptMappedClaims": null,
    "accessTokenAcceptedVersion": null,
    "addIns": [],
    "allowPublicClient": true,
........
###改变为
{
    "id": "79448457-d7a9-4b27-be7b-f70fd311e45f",
    "acceptMappedClaims": null,
    "accessTokenAcceptedVersion": 2,
    "addIns": [],
    "allowPublicClient": true,
.......

操作截图:

 

附录:配置OAuth 2.0 的三个重要步骤

 

一:在 Azure AD 中授予权限

注册了用于表示 API 和开发人员控制台的两个应用程序之后,请授予权限以允许客户端应用调用后端应用。

  1. 转到 Azure 门户来向客户端应用程序授予权限。 搜索并选择“应用注册”。
  2. 选择你的客户端应用程序。 然后,在应用的页面列表中,选择“API 权限”。
  3. 选择“添加权限”。
  4. 在“选择 API”下,选择“我的 API”,然后找到并选择你的 backend-app。
  5. 在“委托的权限”下,选择对 backend-app 的适当权限,然后选择“添加权限”。
  6. (可选)在“API 权限”页上,选择“授予对 <your-tenant-name> 的管理员许可”,为此目录中的所有用户授予许可。

二:在开发人员门户中启用 OAuth 2.0 用户授权

此时,我们已在 Azure AD 中创建应用程序,并已授予适当的权限来让客户端应用调用后端应用。

在本示例中,开发人员控制台是 client-app。 以下步骤说明如何在开发人员门户中启用 OAuth 2.0 用户授权

  1. 在 Azure 门户中,浏览找到你的 API 管理实例。
  2. 选择“OAuth 2.0” > “添加”。
  3. 提供“显示名称”和“说明”。
  4. 对于“客户端注册页 URL”,请输入占位符值,如 http://localhost。 “客户端注册页 URL”指向供用户针对 OAuth 2.0 提供程序创建和配置其自己的帐户的页面。 在此示例中,用户不创建和配置自己的帐户,因此使用了占位符。
  5. 选择“授权代码”作为“授权类型”。
  6. 指定“授权终结点 URL”和“令牌终结点 URL”。 可以从 Azure AD 租户中的“终结点”页检索这些值。 再次浏览到“应用注册”页,并选择“终结点”。
  7. 复制“OAuth 2.0 授权终结点”,并将其粘贴到“授权终结点 URL”文本框。 选择“授权”请求方法下的“POST”。
  8. 复制“OAuth 2.0 令牌终结点”,并将其粘贴到“令牌终结点 URL”文本框。
    重要
    使用“v1”或“v2”终结点 。 但是,根据所选的版本,以下步骤将有所不同。 我们建议使用 v2 终结点。
  9. 如果使用 v1 终结点,请添加名为 resource 的主体参数。 使用后端应用的“应用程序 ID”作为此参数的值。
  10. 如果使用 v2 终结点,请在“默认范围”字段中使用为后端应用创建的范围。 另外,确保在应用程序清单中将 accessTokenAcceptedVersion 属性的值设置为 2。
  11. 接下来,指定客户端凭据。 这些是 client-app 的凭据。
  12. 对于“客户端 ID”,请使用客户端应用的“应用程序 ID”。
  13. 对于“客户端机密”,请使用前面为 client-app 创建的密钥。
  14. 紧接在客户端机密的后面,是授权代码授权类型的 redirect_url。 记下此 URL。
  15. 选择“创建” 。
  16. 返回到 Azure Active Directory 中的客户端应用注册,并选择“身份验证”。
  17. 在“平台配置”下,单击“添加平台”,然后选择“Web”作为类型,将“redirect_url”粘贴在“重定向 URI”下,然后单击“配置”按钮进行保存。

配置 OAuth 2.0 授权服务器后,开发人员控制台可从 Azure AD 获取访问令牌。

下一步是为 API 启用 OAuth 2.0 用户授权。 这使得开发人员控制台知道在调用 API 之前,需要代表用户获取访问令牌。

  1. 浏览到 API 管理实例,并转到“API”。
  2. 选择要保护的 API。 例如,Echo API。
  3. 转到“设置”。
  4. 在“安全性”下,选择“OAuth 2.0”并选择前面配置的 OAuth 2.0 服务器。
  5. 选择“保存” 。

三: 配置 JWT 验证策略,对请求进行预授权

此时,当用户尝试从开发人员控制台发出调用时,系统会提示其登录。 开发人员控制台将代表用户获取访问令牌,并在对 API 发出的请求中包含该令牌。

但是,如果有人调用我们的 API 但未提供令牌或者提供无效的令牌,会发生什么情况? 例如,如果在不使用 Authorization 标头的情况下尝试调用 API,调用仍将继续。 原因是 API 管理暂时不会验证访问令牌。 它只是将 Authorization 标头传递给后端 API。

使用验证 JWT 策略通过验证每个传入请求的访问令牌,对 API 管理中的请求进行预授权。 如果某个请求没有有效的令牌,API 管理会阻止该请求。 例如,在 Echo API 的 <inbound> 策略部分中添加以下策略。 它会检查访问令牌中的受众声明,如果令牌无效,则会返回一条错误消息。 有关如何配置策略的信息,请参阅设置或编辑策略。

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration" />
    <required-claims>
        <claim name="aud">
            <value>{Application ID of backend-app}</value>
        </claim>
    </required-claims>
</validate-jwt>

备注

此 openid-config URL 对应于 v1 终结点。 对于 v2 openid-config 终结点,请使用以下 URL:

https://login.partner.microsoftonline.cn/common/v2.0/.well-known/openid-configuration.

 

参考文档

在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端:https://docs.azure.cn/zh-cn/api-management/api-management-howto-protect-backend-with-aad

验证 JWT: https://docs.microsoft.com/zh-cn/azure/api-management/api-management-access-restriction-policies#validate-jwt

 

相关文章
|
人工智能 前端开发 API
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
Gemini Coder 是一款基于 Google Gemini API 的 AI 应用生成工具,支持通过文本描述快速生成代码,并提供实时代码编辑和预览功能,简化开发流程。
1466 38
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
|
人工智能 搜索推荐 IDE
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
本文介绍了Web Unlocker API、Web-Scraper和SERP API三大工具,助力解决AI训练与微调数据集获取难题。Web Unlocker API通过智能代理和CAPTCHA绕过技术,高效解锁高防护网站数据;Web-Scraper支持动态内容加载,精准抓取复杂网页信息;SERP API专注搜索引擎结果页数据抓取,适用于SEO分析与市场研究。这些工具大幅降低数据获取成本,提供合规保障,特别适合中小企业使用。粉丝专属体验入口提供2刀额度,助您轻松上手!
1045 2
|
XML JSON API
Understanding RESTful API and Web Services: Key Differences and Use Cases
在现代软件开发中,RESTful API和Web服务均用于实现系统间通信,但各有特点。RESTful API遵循REST原则,主要使用HTTP/HTTPS协议,数据格式多为JSON或XML,适用于无状态通信;而Web服务包括SOAP和REST,常用于基于网络的API,采用标准化方法如WSDL或OpenAPI。理解两者区别有助于选择适合应用需求的解决方案,构建高效、可扩展的应用程序。
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
475 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
4165 12
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
|
JSON 缓存 测试技术
构建高效RESTful API的后端实践指南####
本文将深入探讨如何设计并实现一个高效、可扩展且易于维护的RESTful API。不同于传统的摘要概述,本节将直接以行动指南的形式,列出构建RESTful API时必须遵循的核心原则与最佳实践,旨在为开发者提供一套直接可行的实施框架,快速提升API设计与开发能力。 ####
|
缓存 前端开发 API
深入浅出:后端开发中的RESTful API设计原则
【10月更文挑战第43天】在数字化浪潮中,后端开发如同搭建梦想的脚手架,而RESTful API则是连接梦想与现实的桥梁。本文将带你领略API设计的哲学之美,探索如何通过简洁明了的设计,提升开发效率与用户体验。从资源定位到接口约束,从状态转换到性能优化,我们将一步步构建高效、易用、可维护的后端服务。无论你是初涉后端的新手,还是寻求进阶的开发者,这篇文章都将为你的开发之路提供指引。让我们一起走进RESTful API的世界,解锁后端开发的新篇章。
|
JSON API 数据格式
探索后端开发:从零构建简易RESTful API
在数字时代的浪潮中,后端开发如同搭建一座桥梁,连接着用户界面与数据世界。本文将引导读者步入后端开发的殿堂,通过构建一个简易的RESTful API,揭示其背后的逻辑与魅力。我们将从基础概念出发,逐步深入到实际操作,不仅分享代码示例,更探讨如何思考和解决问题,让每一位读者都能在后端开发的道路上迈出坚实的一步。
|
缓存 API 开发者
构建高效后端服务:RESTful API设计原则与实践
【10月更文挑战第43天】在数字化时代的浪潮中,后端服务的稳定性和效率成为企业竞争力的关键。本文将深入探讨如何构建高效的后端服务,重点介绍RESTful API的设计原则和实践技巧,帮助开发者提升服务的可用性、可扩展性和安全性。通过实际代码示例,我们将展示如何将这些原则应用到日常开发工作中,以确保后端服务能够支撑起现代Web和移动应用的需求。