Microsoft 帐户 JWT 身份验证令牌如何签名?

Posted

技术标签:

【中文标题】Microsoft 帐户 JWT 身份验证令牌如何签名?【英文标题】:How are Microsoft account JWT authentication tokens signed? 【发布时间】:2014-10-15 18:00:56 【问题描述】:

在我的 Web 应用程序中,我需要验证从 Live SDK 5.6 获得的 JWT 身份验证令牌。 不久前,这些令牌的签名是使用签名密钥的 base64 编码标头 + 有效负载的 HMACSHA256 哈希,这是应用程序机密(来自 account.live.com/developers/applications)+“JWTSig”。 现在好像不是这样了。

有人知道现在这些令牌是如何签名的吗?

对不起我的英语。

【问题讨论】:

【参考方案1】:

执行此操作的最佳方法是获取从 Azure 移动服务返回的 JWT 令牌,并验证它是使用来自 AMS 的相同主密钥签名的。 GitHub上有一个项目展示了如何做到这一点:

JWT Validator

这基本上是另一个 GitHub 项目的衍生品,这里有原始 ASP.NET 示例:

AuthenticationTokenSample

主要验证发生在调用 ValidateSignature() 方法时,该方法获取 JWT 声明段的 UTF-8 表示形式的字节,并使用来自 Azure Mobile Services 的共享密钥在它们上计算 HMAC SHA-256 MAC。如果 JWT Crypto Segment 和之前计算的值,则可以确认该密钥用于在 JWT 上生成 HMAC,并且 JWT Claim Segment 的内容没有被篡改。

我发现的一件主要事情是在ValidateSignature() 方法中删除附加到主密钥的"JWTSig" 字符串。似乎正在签名的令牌不再从AMS 将该字符串附加到主密钥。在删除该段之前,我在通过验证时遇到了各种各样的麻烦。

【讨论】:

以上是关于Microsoft 帐户 JWT 身份验证令牌如何签名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Microsoft 身份的情况下对 blazor 服务器进行 jwt 身份验证?

Google 登录 - 访问令牌、身份验证令牌和 JWT ID 令牌之间的区别

如何验证 Kubernetes 服务帐户令牌 (JWT)

使用 Microsoft System.IdentityModel.Tokens.Jwt 在 Asp.net WebApi 中实现 JWT 身份验证

Docusign REST API:使用 Microsoft Flow 的 JWT Grant 实现 OAuth 身份验证

基于 JWT 的身份验证/授权与 Microsoft Identity 2