Azure中使用OBO流获取SAML令牌失败的问题排查
解决AADSTS50013: 断言签名验证失败(密钥未找到)问题
针对你用OBO流获取SAML令牌时遇到的签名验证错误,以下是排查和解决方向:
检查SAML企业应用的签名证书
登录Azure门户,进入你的SAML企业应用,在「Single sign-on」->「SAML签名证书」页面确认:- 证书处于活跃状态,未过期
- 若使用自定义证书,确保公钥已正确上传到Azure AD,且应用侧持有对应的私钥
- 避免使用已撤销的证书
确认服务主体的应用权限配置
你用来获取初始access token的应用注册(服务主体),需要在SAML企业应用的「API权限」中添加应用权限(而非委派权限),并且必须完成管理员同意。权限需对应SAML应用暴露的角色,且状态显示为「已授予管理员同意」。验证初始access token的签名密钥
解码第一步获取的access token,查看kid或x5t声明。通过Azure AD的OpenID配置端点https://login.microsoftonline.com/{TENANT_ID}/v2.0/.well-known/openid-configuration获取密钥集,确认其中包含该kid对应的公钥。如果不存在,需重新生成或上传服务主体的密钥/证书。核对SAML应用的「已知客户端应用」配置
在SAML企业应用的「属性」页面,确认「已知客户端应用」字段已正确填入你用于OBO交换的应用注册的Client ID,且配置已保存。该设置用于允许指定客户端代表身份请求SAML令牌。修正OBO请求的客户端凭据
你的第二个请求中,client_id和client_secret应该是用于OBO交换的应用注册的凭据,而非SAML企业应用的ID和密钥。修正后的代码示例:
# 修正后的OBO请求payload payload = { "client_id": client_id, # 替换为第一步获取access token的应用注册Client ID "client_secret": client_secret, # 对应第一步的Client Secret "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer", "scope": ["<app_id_of_saml_application>/.default"], "assertion": access_token, # 第一步获取的access token "requested_token_use": "on_behalf_of", "requested_token_type": "urn:ietf:params:oauth:token-type:saml2", } authority = f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token" response = requests.post(authority, data=payload)
内容的提问来源于stack exchange,提问作者Jhooma
相关产品推荐
相关产品推荐

