如何验证 idToken 是否有效
How to verify that the idToken is valid
我是 运行 web-app-samples-for-adal4j 并且我能够看到 /secure/aad 页面并且我能够恢复 Azure AD 发送的 idToken。
但是,我的想法是将该令牌传递给不同的服务和它们,每个服务都可以验证该令牌是否有效。
所以,总而言之,我希望能够从服务中检查给定的 idtoken 是否有效。据我了解,您必须验证可以从令牌中恢复的 JWT 是否使用证书签名。我错了吗?
我正在使用这个网站 http://jwt.calebb.net/ 来检查我是否可以解码 JWT。在最后一部分我可以看到签名。
所以,我的问题是,外部服务如何验证令牌是由某个证书编码的?而且,该证书在哪里(它在联邦元数据文档中)?
根据我的理解,id_token用于客户端验证当前用户信息。要检查资源的特定权限,我们通常使用 access_token.
要验证从使用 OpenId 连接协议与 Azure 集成的 Azure AD 发出的 id_token,我们可以按照以下步骤(参考 OpenId specification):
- 如果 ID 令牌已加密,请使用客户端在注册期间指定的密钥和算法对其进行解密,OP 将使用这些密钥和算法来加密 ID 令牌。如果在注册时与 OP 协商加密并且 ID 令牌未加密,RP 应该拒绝它。
- OpenID 提供者的发行者标识符(通常在发现期间获得)必须与 iss(发行者)声明的值完全匹配。
- 客户必须验证 aud(受众)声明包含其在发行者处注册的 client_id 值,该发行者由 iss(发行者)声明标识为受众。 aud(观众)声明可以包含一个包含多个元素的数组。如果 ID 令牌未将客户列为有效受众,或者如果它包含客户不信任的其他受众,则必须拒绝 ID 令牌。
- 如果 ID 令牌包含多个受众,客户应该验证是否存在 azp 声明。
- 如果存在 azp(授权方)索赔,客户应验证其 client_id 是索赔值。
- 如果 ID 令牌是通过客户端和令牌端点之间的直接通信接收的(在本流程中),TLS 服务器验证可以用于验证颁发者而不是检查令牌签名。客户端必须根据 JWS [JWS] 使用 JWT alg Header 参数中指定的算法验证所有其他 ID 令牌的签名。客户必须使用发行人提供的密钥。
- alg 值应该是 RS256 的默认值或客户端在注册期间在 id_token_signed_response_alg 参数中发送的算法。
- 如果 JWT alg Header 参数使用基于 MAC 的算法,例如 HS256、HS384 或 HS512,client_secret 对应的 UTF-8 表示的八位字节aud (audience) Claim 中包含的 client_id 用作验证签名的密钥。对于基于 MAC 的算法,如果 aud 是 multi-valued 或者如果存在与 aud 值不同的 azp 值,则行为未指定。
- 当前时间必须早于 exp 声明所代表的时间。
- iat Claim 可用于拒绝距离当前时间太远的令牌,限制随机数需要存储的时间量以防止攻击。可接受的范围因客户而异。
- 如果在身份验证请求中发送了 nonce 值,则必须存在 nonce 声明并检查其值以验证它是否与身份验证请求中发送的值相同。客户端应该检查重放攻击的现时值。检测重放攻击的精确方法是特定于客户端的。
- 如果请求了 acr 声明,客户应该检查声明的声明值是否合适。 acr 声明值的含义和处理超出了本规范的范围。
- 如果请求 auth_time 声明,无论是通过针对此声明的特定请求还是使用 max_age 参数,客户端应检查 auth_time 声明值并请求 re-authentication 如果它确定自上次 End-User 身份验证以来已经过去了太多时间。
并且您可以使用基于您正在开发的端点的 OpenID Connect 元数据文档获取验证签名所需的签名密钥数据:
https://login.microsoftonline.com/common/.well-known/openid-configuration
https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
我是 运行 web-app-samples-for-adal4j 并且我能够看到 /secure/aad 页面并且我能够恢复 Azure AD 发送的 idToken。
但是,我的想法是将该令牌传递给不同的服务和它们,每个服务都可以验证该令牌是否有效。
所以,总而言之,我希望能够从服务中检查给定的 idtoken 是否有效。据我了解,您必须验证可以从令牌中恢复的 JWT 是否使用证书签名。我错了吗?
我正在使用这个网站 http://jwt.calebb.net/ 来检查我是否可以解码 JWT。在最后一部分我可以看到签名。
所以,我的问题是,外部服务如何验证令牌是由某个证书编码的?而且,该证书在哪里(它在联邦元数据文档中)?
根据我的理解,id_token用于客户端验证当前用户信息。要检查资源的特定权限,我们通常使用 access_token.
要验证从使用 OpenId 连接协议与 Azure 集成的 Azure AD 发出的 id_token,我们可以按照以下步骤(参考 OpenId specification):
- 如果 ID 令牌已加密,请使用客户端在注册期间指定的密钥和算法对其进行解密,OP 将使用这些密钥和算法来加密 ID 令牌。如果在注册时与 OP 协商加密并且 ID 令牌未加密,RP 应该拒绝它。
- OpenID 提供者的发行者标识符(通常在发现期间获得)必须与 iss(发行者)声明的值完全匹配。
- 客户必须验证 aud(受众)声明包含其在发行者处注册的 client_id 值,该发行者由 iss(发行者)声明标识为受众。 aud(观众)声明可以包含一个包含多个元素的数组。如果 ID 令牌未将客户列为有效受众,或者如果它包含客户不信任的其他受众,则必须拒绝 ID 令牌。
- 如果 ID 令牌包含多个受众,客户应该验证是否存在 azp 声明。
- 如果存在 azp(授权方)索赔,客户应验证其 client_id 是索赔值。
- 如果 ID 令牌是通过客户端和令牌端点之间的直接通信接收的(在本流程中),TLS 服务器验证可以用于验证颁发者而不是检查令牌签名。客户端必须根据 JWS [JWS] 使用 JWT alg Header 参数中指定的算法验证所有其他 ID 令牌的签名。客户必须使用发行人提供的密钥。
- alg 值应该是 RS256 的默认值或客户端在注册期间在 id_token_signed_response_alg 参数中发送的算法。
- 如果 JWT alg Header 参数使用基于 MAC 的算法,例如 HS256、HS384 或 HS512,client_secret 对应的 UTF-8 表示的八位字节aud (audience) Claim 中包含的 client_id 用作验证签名的密钥。对于基于 MAC 的算法,如果 aud 是 multi-valued 或者如果存在与 aud 值不同的 azp 值,则行为未指定。
- 当前时间必须早于 exp 声明所代表的时间。
- iat Claim 可用于拒绝距离当前时间太远的令牌,限制随机数需要存储的时间量以防止攻击。可接受的范围因客户而异。
- 如果在身份验证请求中发送了 nonce 值,则必须存在 nonce 声明并检查其值以验证它是否与身份验证请求中发送的值相同。客户端应该检查重放攻击的现时值。检测重放攻击的精确方法是特定于客户端的。
- 如果请求了 acr 声明,客户应该检查声明的声明值是否合适。 acr 声明值的含义和处理超出了本规范的范围。
- 如果请求 auth_time 声明,无论是通过针对此声明的特定请求还是使用 max_age 参数,客户端应检查 auth_time 声明值并请求 re-authentication 如果它确定自上次 End-User 身份验证以来已经过去了太多时间。
并且您可以使用基于您正在开发的端点的 OpenID Connect 元数据文档获取验证签名所需的签名密钥数据:
https://login.microsoftonline.com/common/.well-known/openid-configuration https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration