【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 版本而导致的。
- OAuth V1 终结点为:https://login.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration, 它使用的Issuer为:https://sts.chinacloudapi.cn/{aad-tenant}/
- OAuth V2 终结点为:https://login.partner.microsoftonline.cn/{aad-tenant}/v2.0/.well-known/openid-configuration,它使用的Issuer为:https://login.partner.microsoftonline.cn/{aad-tenant}/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 和开发人员控制台的两个应用程序之后,请授予权限以允许客户端应用调用后端应用。
转到 Azure 门户来向客户端应用程序授予权限。 搜索并选择“应用注册”。
选择你的客户端应用程序。 然后,在应用的页面列表中,选择“API 权限”。
选择“添加权限”。
在“选择 API”下,选择“我的 API”,然后找到并选择你的 backend-app。
在“委托的权限”下,选择对 backend-app 的适当权限,然后选择“添加权限”。
(可选)在“API 权限”页上,选择“授予对 <your-tenant-name> 的管理员许可”,为此目录中的所有用户授予许可。
二:在开发人员门户中启用 OAuth 2.0 用户授权
此时,我们已在 Azure AD 中创建应用程序,并已授予适当的权限来让客户端应用调用后端应用。
在本示例中,开发人员控制台是 client-app。 以下步骤说明如何在开发人员门户中启用 OAuth 2.0 用户授权
在 Azure 门户中,浏览找到你的 API 管理实例。
选择“OAuth 2.0” > “添加”。
提供“显示名称”和“说明”。
对于“客户端注册页 URL”,请输入占位符值,如
http://localhost。 “客户端注册页 URL”指向供用户针对 OAuth 2.0 提供程序创建和配置其自己的帐户的页面。 在此示例中,用户不创建和配置自己的帐户,因此使用了占位符。
选择“授权代码”作为“授权类型”。
指定“授权终结点 URL”和“令牌终结点 URL”。 可以从 Azure AD 租户中的“终结点”页检索这些值。 再次浏览到“应用注册”页,并选择“终结点”。
复制“OAuth 2.0 授权终结点”,并将其粘贴到“授权终结点 URL”文本框。 选择“授权”请求方法下的“POST”。
复制“OAuth 2.0 令牌终结点”,并将其粘贴到“令牌终结点 URL”文本框。
重要
使用“v1”或“v2”终结点 。 但是,根据所选的版本,以下步骤将有所不同。 我们建议使用 v2 终结点。
如果使用 v1 终结点,请添加名为 resource 的主体参数。 使用后端应用的“应用程序 ID”作为此参数的值。
如果使用 v2 终结点,请在“默认范围”字段中使用为后端应用创建的范围。 另外,确保在应用程序清单中将
accessTokenAcceptedVersion属性的值设置为2。
接下来,指定客户端凭据。 这些是 client-app 的凭据。
对于“客户端 ID”,请使用客户端应用的“应用程序 ID”。
对于“客户端机密”,请使用前面为 client-app 创建的密钥。
紧接在客户端机密的后面,是授权代码授权类型的 redirect_url。 记下此 URL。
选择“创建” 。
返回到 Azure Active Directory 中的客户端应用注册,并选择“身份验证”。
在“平台配置”下,单击“添加平台”,然后选择“Web”作为类型,将“redirect_url”粘贴在“重定向 URI”下,然后单击“配置”按钮进行保存。
配置 OAuth 2.0 授权服务器后,开发人员控制台可从 Azure AD 获取访问令牌。
下一步是为 API 启用 OAuth 2.0 用户授权。 这使得开发人员控制台知道在调用 API 之前,需要代表用户获取访问令牌。
浏览到 API 管理实例,并转到“API”。
选择要保护的 API。 例如,
Echo API。
转到“设置”。
在“安全性”下,选择“OAuth 2.0”并选择前面配置的 OAuth 2.0 服务器。
选择“保存” 。
三: 配置 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-configURL 对应于 v1 终结点。 对于 v2openid-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
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误的更多相关文章
- Web APi 2.0优点和特点?在Web APi中如何启动Session状态?
		前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此 ... 
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
		原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ... 
- 主攻ASP.NET MVC4.0之重生:ASP.NET MVC  Web API
		UserController代码: using GignSoft.Models; using System; using System.Collections.Generic; using Syste ... 
- ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API
		在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ... 
- 如何将.NET 4.0写的Windows service和Web API部署到docker上面
		Web API. 看这篇文章: https://docs.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc Win ... 
- WEB前后端分离开发中的验证与安全问题
		登录验证以及安全问题: 1.请求接口全部用post方式,在后端判断请求方式是否为post 2.登录密码等敏感信息要加密后传输,如用RSA(支付宝里可下载公私钥生成工具),客户端公钥加密,传到服务器后再 ... 
- [整理]IIS 6.0 下部署 Asp.net MVC Web Api 后 HTTP PUT and DELETE 请求失败
		http://guodong.me/?p=1560 ASP.NET MVC 4 has a new feature called WebAPI which makes it much easier t ... 
- Oracle中使用hash_hmac() 函数报错问题/以及Oracle遇到Oauth1.0授权和oauth_signature生成规则
		最近在Oracle上发现使用hash_hmac()报找不到此函数.为此特意查到oracle的文档.详细请看官网回答:https://cx.rightnow.com/app/answers/detail ... 
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
		作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ... 
- devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务
		使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ... 
随机推荐
- CentOS8 安装Oracle19c RPM的办法
			1. 下载相应的rpm包 我这边使用的主要有: -rw-r--r-- 1 root root 19112 Apr 5 15:13 compat-libcap1-1.10-7.el7.x86_64.rp ... 
- zabbix监控进程和监控日志
			zabbix监控进程和监控日志 文章目录 zabbix监控进程和监控日志 一.自定义监控进程 1.新建脚本存放目录 2.修改zabbix_agentd.conf文件 3.zabbix server端进 ... 
- 庖丁解牛:最全babel-plugin-import源码详解
			庖丁解牛:最全 babel-plugin-import 源码详解 序言:在用 babel-plugin 实现按需加载一文中笔者用作用域链思路实现了按需加载组件.此思路是统一式处理,进入 ImportD ... 
- 大数据从业者必知必会的Hive SQL调优技巧 | 京东云技术团队
			摘要:在大数据领域中,Hive SQL被广泛应用于数据仓库的数据查询和分析.然而,由于数据量庞大和复杂的查询需求,Hive SQL查询的性能往往不尽人意.本文针对Hive SQL的性能优化进行深入研究 ... 
- 【解决了一个小问题】macbook m1上的docker build问题
			作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1. docker hub限制的问题 因为docker b ... 
- Centos7把home目录下多余的空间转移到/根目录下
			通过df-h发现,根目录只有32G,而home目录可用的,居然有142G.我现在想分出70G给根目录 把你需要挂载的机器的逻辑卷记住(上面的图,左边是逻辑卷,右边是虚拟磁盘) /dev/mapper/ ... 
- 虚拟IP绑定公网IP访问
			绑定公网 IP 我们目前的虚拟 IP,还不能通过公网的形式进行访问,我们首先,来使用内部的 IP 进行访问看看效果如下: curl 虚拟IP 如上图我访问了两次,第一次访问返回的是 2222 的 ng ... 
- postman测试Integer[]数组
			背景说明:在做批量删除列表数据的时候,前端发送数组格式给后端,后端使用数组格式(Integer[] ids)接受,需要使用postman测试结果. @ApiOperation("管理系统-删 ... 
- 数据挖掘机器学习[七]---2021研究生数学建模B题空气质量预报二次建模求解过程:基于Stacking机器学习混合模型的空气质量预测{含码源+pdf文章}
			相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据挖掘机器学习---汽车交易价格预测详细版本[二]{EDA-数据探索性分析} 数据挖掘机器学习 ... 
- PaddleNLP通用信息抽取技术UIE【一】产业应用实例:信息抽取{实体关系抽取、中文分词、精准实体标。情感分析等}、文本纠错、问答系统、闲聊机器人、定制训练
			相关文章: 1.快递单中抽取关键信息[一]----基于BiGRU+CR+预训练的词向量优化 2.快递单信息抽取[二]基于ERNIE1.0至ErnieGram + CRF预训练模型 3.快递单信息抽取[ ... 
