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