Azure AD 签名密钥会定期轮换,有时也会立即轮换。
请查看相关的微软指南:Azure Active Directory 中的签名密钥滚动更新 https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-signing-key-rollover
出于安全目的,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
value.
您也可以使用通用端点来获取该信息或租户特定的端点。
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
The kid
此处找到的密钥值将与用于签署您收到的令牌的密钥的标识符匹配。您可以在令牌标头中检查这一点。例子:
{
"typ": "JWT",
"alg": "RS256",
"x5t": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk",
"kid": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk"
}
顺便说一句——
-
如果您计划缓存某些密钥,您的应用程序将需要定期检查更新,如果出现故障,请根据需要转到上面的端点以获取新密钥。此 Microsoft 文档介绍验证签名 https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens#validating-the-signature提到
检查所使用的公钥更新的合理频率
Azure AD 每 24 小时一次。
很多时候,甚至不需要显式验证令牌,因为 Azure AD 中间件具有验证访问令牌的内置功能。