【Azure 环境】从Azure AD(Entra ID)中获取的Token在访问自定义的接口应用时验证不通过

news/2025/3/12 10:28:00/文章来源:https://www.cnblogs.com/lulight/p/18568523

问题描述

集成Azure AD(新名称Microsoft Entra ID),拿到对应的accessToken作为登录用的凭证。这个 AccessToken 能够正常返回,并作为Microsoft Graph userinfo API的Authorization,因为应用中会对前端传递过来的 AccessToken进行校验合法性。但目前遇见的问题时这个 Token 签名校验失败。

“'IDX10503: Signature validation failed. Keys tried: 'Microsoft.IdentityModel.Tokens.X509SecurityKey , KeyId: xxxxxxxxxxxxxxxxxxx”

如下是Token通过JWT.IO解码后的Header部分截图:

 

问题解答

在查看对Access Token进行JWT解码截图,Header中包含了nonce 参数,这意味着这个Token需要特殊处理,使用常规的JWT验证方法(正常处理)会失败。

## 常规验证AAD Token的 方法:

        String stoken = "eyJ0eXAiOiJKV1QiLCJhbGciO......................_-dIQ";DecodedJWT jwt = JWT.decode(stoken);        JwkProvider provider = null;Jwk jwk = null;Algorithm algorithm = null;try {URL keysURL = new URL("https://login.partner.microsoftonline.cn/common/discovery/keys");provider = new UrlJwkProvider(keysURL);jwk = provider.get(jwt.getKeyId());algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);algorithm.verify(jwt);//if the token signature is invalid, the method will throw SignatureVerificationExceptionSystem.out.println("JWT Validation completed.");} catch (JwkException e) {e.printStackTrace();} catch (SignatureVerificationException e) {System.out.println(e.getMessage());}

在GitHub 平台中,关于nonce的说明有:

The 'nonce' is a mechanism, that allows the receiver to determine the token was forwarded. The signature is over the transformed nonce, so if you try and validate it directly, the signature will fail. Graph can determine that this token was replayed.
“随机数”是一种机制,允许接收者确定令牌已转发。签名是在转换后的随机数上进行的,因此如果您尝试直接验证它,签名将会失败。 Graph可以确定该令牌被重放。

同时,也有声明 Microsoft Graph 认识到了提高用户安全性的机会。通过将“nonce”放入 jwt 标头中来实现这一目标。JWS 使用随机数的 SHA2 进行签名,“随机数”在 JWS 序列化之前被替换。

所以自己在应用中验证Token并不是一个有效的办法,可以直接把Token转递给Microsoft Graph userinfo API, 让API自行验证Token。

 

 

参考资料

Cannot validate signature : https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/840999.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多平台数据集成的实践案例:吉客云到MySQL

测试-查询销售渠道信息(已删除数据)-dange:吉客云数据集成到MySQL的技术案例分享 在现代企业的数据管理中,如何高效、可靠地实现多平台间的数据集成是一个关键问题。本次我们将聚焦于一个具体的系统对接案例,即将吉客云中的销售渠道信息(包括已删除数据)集成到MySQL数据库…

简洁的bootstrap垂直tab选项卡

这是一款简洁的bootstrap垂直tab选项卡。该选项卡在bootstrap原有的选项卡插件的基础上,通过添加一些css样式,将它显示为垂直的选项卡。演示 下载使用方法 在页面中引入下面的文件。<link rel="stylesheet" href="https://cdn.bootcss.com/twitter-boots…

会计科目-5大基础科目(资产,损益类-负债-所有者权益-成本)

资成费,负所收”方;负债、 有借必有贷,借贷必相等会计科目本质:资产类 负债类 损益类所有者权益成本类

[Linux]简单的shell实现

一个简单的shell实现 什么是内建命令 内建命令是由shell本身提供的命令,而不是通过外部程序(如位于/bin、/usr/bin等目录下的可执行文件)来执行的命令。这些命令在shell启动的时候就加载到内存中,执行效率相对较高。 常见的内建命令有:cd,pwd,echo。 什么是当前路径 本质…

敏捷开发:Sprint Planning 冲刺计划会议详细介绍和用户故事拆分、开发任务细分

Sprint Planning 冲刺计划会议简介 Sprint Planning (冲刺计划会议),又叫规划会议。此会议通过 Scrum 团队的集体沟通讨论,确定接下来的 Sprint 中要完成的待开发项,把它们组成一个 Sprint Backlog。这些待开发项都是从 Product Backlog 中挑选的。Product Backlog:产品功…

jmeter之性能测试(16.1)

一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试 2、性能测试的时间? 在功能测试完成后才能进行性能测试…

高级语言程序设计作业 11/25

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第五次作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:102400215 姓名:胡加乘14.17 复习题 3 struct month {const char* name; // 月份名const char abbr[4];…

【红队】windows立足点建立技术

本文涵盖了将PowerShell-Empire设置为C2服务器的过程,以及如何生成可用于在目标系统上获得初步立足点的宏Excel文档。 ATT& CK 初始访问包括使用各种进入向量在网络中获得其初始立足点的技术。用于获得立足点的技术包括有针对性的鱼叉式网络钓鱼和利用面向公众的Web服务器…

公钥加密系统与离散对数问题

概念 1 单向函数和陷门信息 单向函数是一种可逆函数,其正向计算容易,但反向计算却非常困难。 安全的公钥加密系统(Public Key Cryptosystem, 简称PKC)基于具有陷门的单向函数。陷门是一种辅助信息,利用它可以轻松计算单向函数的反函数。“陷门”一词来源于物理或机械陷阱的…

ljnljn小站上线啦

站内设有多个Web靶场以及Cyberchef,欢迎大家前来遛遛~ 地址:http://8.130.110.67/

周末基于 .NET 9 + K8S 写了个 MockHttp

MockHTTP MockHTTP 可以将现有HTTP转换成GET请求,设置cron定时调用,自定义代码去格式化数据,通知到你的邮箱里。 比如每天早上时自动获取博客园文章列表,天气下雨时通知,各类签到等 Request 创建一个请求 可以使用VSCode或VS,创建一个.http文件 POST https://www.wdora.c…