如何验证idToken是否有效

时间:2016-11-14 11:12:33

标签: java token azure-active-directory adal verify

我正在运行 web-app-samples-for-adal4j ,我能够看到/ secure / aad页面,我能够恢复Azure AD发送的idToken。

但是,我的想法是将该令牌传递给不同的服务和它们,每个服务都可以验证令牌是否有效。

因此,总结一下,我希望能够从服务中检查,给出的idtoken是有效的。据我所知,您必须验证您可以从令牌恢复的JWT是否已使用证书进行签名。我错了吗?

我正在使用此网站http://jwt.calebb.net/来检查我是否可以解码JWT。在最后一部分,我可以看到签名。

所以,我的问题是,外部服务如何验证令牌是否由某个证书编码?而且,该证书在哪里(是在联邦元数据文件中)?

1 个答案:

答案 0 :(得分:1)

根据我的理解,id_token用于客户端验证当前用户信息。要检查资源的特定权限,我们通常使用access_token。

要验证从Azure AD发出的使用OpenId连接协议与Azure集成的id_token,我们可以按照以下步骤操作(请参阅OpenId specification):

  1. 如果ID令牌已加密,请使用客户端在注册期间指定的用于加密ID令牌的密钥和算法对其进行解密。如果在注册时与OP协商加密并且ID令牌未加密,则RP应该拒绝加密。
  2. OpenID提供商的发卡行标识符(通常在发现期间获得)必须与iss(发行人)索赔的价值完全匹配。
  3. 客户必须验证aud(观众)声明是否包含其在iss(发行人)声明所标识的发行人处注册的client_id值作为观众。 aud(audience)Claim可以包含一个包含多个元素的数组。如果ID令牌未将客户端列为有效受众,或者其中包含客户不信任的其他受众,则必须拒绝ID令牌。
  4. 如果ID令牌包含多个受众群体,则客户端应该验证是否存在azp声明。
  5. 如果存在azp(授权方)声明,则客户应该验证其client_id是声明值。
  6. 如果通过客户端和令牌端点之间的直接通信(它在此流程中)接收到ID令牌,则可以使用TLS服务器验证来验证发行者,而不是检查令牌签名。客户端必须使用JWT alg Header Parameter中指定的算法,根据JWS [JWS]验证所有其他ID令牌的签名。客户必须使用发行人提供的密钥。
  7. alg值应该是RS256的默认值或客户端在注册期间在id_token_signed_response_alg参数中发送的算法。
  8. 如果JWT alg Header参数使用基于MAC的算法,例如HS256,HS384或HS512,则对应于aud(观众)声明中包含的client_id的client_secret的UTF-8表示的八位字节用作验证签名的关键。对于基于MAC的算法,如果aud是多值的,或者如果存在的azp值不同于aud值,则行为未指定。
  9. 当前时间必须在exp索赔所代表的时间之前。
  10. iat Claim可用于拒绝发布距离当前时间太远的令牌,限制需要存储nonce的时间以防止攻击。可接受的范围是客户特定的。
  11. 如果在身份验证请求中发送了一个nonce值,则必须存在一个nonce声明并检查其值以验证它是否与在Authentication Request中发送的值相同。客户端应该检查重放攻击的nonce值。检测重放攻击的确切方法是客户特定的。
  12. 如果请求了acr Claim,客户应该检查声明的声明值是否合适。 acr Claim Values的含义和处理超出了本规范的范围。
  13. 如果通过对此声明的特定请求或使用max_age参数请求了auth_time声明,则客户端应该检查auth_time声明值并请求重新验证,如果它确定自上次结束后已经过了太多时间 - 用户认证。
  14. 您可以使用位于您正在开发的端点的OpenID Connect元数据文档来获取验证签名所需的签名密钥数据:

    https://login.microsoftonline.com/common/.well-known/openid-configuration https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration