【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

 

相关文章
|
2月前
|
编解码 中间件 API
API实现跨平台访问的方式
【10月更文挑战第16天】API实现跨平台访问的方式
48 2
|
2月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
179 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
3月前
|
API iOS开发 开发者
Snapchat API 访问:Objective-C 实现示例
Snapchat API 访问:Objective-C 实现示例
|
4月前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之海外是否可以访问人物动漫化的api版本
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
53 0
|
16天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
28天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
29天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
2月前
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
19天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
2月前
|
人工智能 自然语言处理 PyTorch
Text2Video Huggingface Pipeline 文生视频接口和文生视频论文API
文生视频是AI领域热点,很多文生视频的大模型都是基于 Huggingface的 diffusers的text to video的pipeline来开发。国内外也有非常多的优秀产品如Runway AI、Pika AI 、可灵King AI、通义千问、智谱的文生视频模型等等。为了方便调用,这篇博客也尝试了使用 PyPI的text2video的python库的Wrapper类进行调用,下面会给大家介绍一下Huggingface Text to Video Pipeline的调用方式以及使用通用的text2video的python库调用方式。