2016-11-14 187 views
0

我正在运行web-app-samples-for-adal4j,我能够看到/ secure/aad页面,并且能够恢复由Azure AD发送的idToken 。如何验证idToken有效

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

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

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

所以,我的问题是,外部服务如何验证令牌是由某个证书编码的?并且,该证书在哪里(是在FEDERATION METADATA文档中)?

回答

1

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

为了验证从天青AD发出id_token其中使用ID连接协议与天青整合,我们可以按照以下的步骤(请参考OpenId specification):

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

而且你可以获取必要的签名密钥数据通过使用位于根据您正在开发的端点ID连接的元数据文件来验证签名:

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