我在 Azure 中有一个企业应用程序(启用了 SAML SSSO),它为我提供了一个包含组信息的 SAML 断言。我在第三方服务中使用该 saml 断言。此流程按普通用户的预期工作(即使用电子邮件/密码)。
现在我希望某些服务帐户/原则能够与人类用户使用相同的第三方服务。从我的阅读来看,代表流程似乎是正确的方式代表流程因此,我创建了一个新的应用程序注册并创建了要使用的秘密,我得到了第一个令牌,如下所示:
# python
payload = {
"client_id": client_id,
"client_secret": client_secret,
"grant_type": "client_credentials",
"scope": ["<app_id_of_saml_application>/.default"],
}
authority = f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token"
response = requests.post(authority, data=payload)
access_token = response.json()["access_token"]
解码后的访问令牌包含我从支持 SAML SSO 的应用程序公开的角色以及指向 SAML 应用程序的
aud
声明。现在我尝试使用此令牌来获取 SAML 断言,如下所示。
# python
payload = {
"client_id": saml_client_id,
"client_secret": saml_client_secret,
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"scope": ["<app_id_of_saml_application>/.default"],
"assertion": access_token, # Access token from previous step
"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)
我收到以下错误:
{"error":"invalid_grant","error_description":"AADSTS50013: Assertion failed signature validation. [Reason - The key was not found.
我认为这是因为我可能没有从 SAML 应用程序公开正确的角色/权限。有人偶然发现这个问题吗?我也将普通应用程序(想要交换令牌)添加到 SAML 应用程序中的受信任应用程序和已知应用程序列表中。
如果有人解决了这个问题,请告诉我。
我期待第二次调用会给我一个 SAML 令牌。
具有自定义签名密钥的应用程序不能用作 OBO 流程中的中间层 API。 这包括配置为单点登录的企业应用程序。如果中间层 API 使用自定义签名密钥,下游 API 将无法验证传递给它的访问令牌的签名。这将导致错误,因为无法安全地接受使用客户端控制的密钥签名的令牌。