Azure Active Directory JWT 公钥更改



Azure AD 会在不发出警告的情况下随机更改 JWT 公共令牌。我可以完全关闭该功能吗? 我希望公钥永远不会改变。

Azure AD 签名密钥会定期轮换,有时也会立即轮换。

请查看相关Microsoft指南:在 Azure Active Directory 中签名密钥滚动更新

出于安全目的,Azure AD 的签名密钥会定期滚动一次 基数,在紧急情况下,可以展期 马上。与 Azure AD 集成的任何应用程序都应是 准备好处理密钥滚动更新事件,无论它的频率如何 可能发生。如果没有,并且您的应用程序尝试使用 用于验证令牌上的签名、登录请求的过期密钥 将失败。

在你的问题中,你提到了"Am I able to turn the functionality off completely? I would like the public key to never change.".

您无法控制此行为,如上面的文档中所述。需要将应用程序设计为可以处理此密钥轮换。

您始终可以使用 OpenID Connect 发现文档获取最新的签名密钥。寻找jwks_uri值。

可以使用通用终结点来访问该信息或特定于租户的终结点。

Azure AD V1 common endpoint - https://login.microsoftonline.com/common/.well-known/openid-configuration    
Azure AD V2 common endpoint - https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration 

签名密钥可以在 URL 中找到,例如

Azure AD V1 - https://login.microsoftonline.com/common/discovery/keys     
Azure AD V2 - https://login.microsoftonline.com/common/discovery/v2.0/keys

同样,您也可以使用特定于租户的终结点,例如

https://login.microsoftonline.com/mytenant.onmicrosoft.com/discovery/keys
https://login.microsoftonline.com/mytenant.onmicrosoft.com/discovery/v2.0/keys

在此处找到的密钥kid值将与用于对收到的令牌进行签名的密钥标识符匹配。您可以在令牌标头中签入。例:

{
"typ": "JWT",
"alg": "RS256",
"x5t": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk",
"kid": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk"
}

附带说明一下——

  1. 如果计划缓存某些密钥,应用需要定期检查更新,如果失败,请按需转到上面的终结点以获取新密钥。本Microsoft关于验证签名的文档提到

    检查 使用的公钥更新的合理频率 Azure AD 为每 24 小时一次。

  2. 很多时候,甚至不需要显式验证令牌,因为 Azure AD 中间件具有用于验证访问令牌的内置功能。

最新更新