如何在 Azure 中使用 OBO 流获取 SAML 令牌

问题描述 投票:0回答:1

我在 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 令牌。

azure single-sign-on openid-connect saml-2.0
1个回答
0
投票

具有自定义签名密钥的应用程序不能用作 OBO 流程中的中间层 API。 这包括配置为单点登录的企业应用程序。如果中间层 API 使用自定义签名密钥,下游 API 将无法验证传递给它的访问令牌的签名。这将导致错误,因为无法安全地接受使用客户端控制的密钥签名的令牌。

© www.soinside.com 2019 - 2024. All rights reserved.