【问题标题】:No access token returned for AD B2C user when requesting Microsoft Graph delegated permissions请求 Microsoft Graph 委派权限时没有为 AD B2C 用户返回访问令牌
【发布时间】:2020-07-02 17:36:08
【问题描述】:

用户故事:给定一个 ADB2C 用户,具有全局管理员角色和01234567-901a-bcde-f012-3456789abcde 的 oid(不是真正的 oid),我希望能够以该用户身份登录并从“https://graph.microsoft.com/beta/me”检索用户配置文件" 或 "https://graph.microsoft.com/beta/users/01234567-901a-bcde-f012-3456789abcde"。两者都在文档中列为 B2C 的有效端点。

它不起作用:

在仅分配了 Microsoft Graph 权限范围的应用注册中,我使用邮递员请求不记名令牌以访问 MS Graph。有一个 Web 重定向 URI (https://oauth.pstmn.io/v1/callback),一个客户端密码,并且对访问和 id 令牌都启用了隐式授权。

请求的范围是:openid offline_access https://graph.microsoft.com/Directory.AccessAsUser.All

同样,B2C 用户帐户具有全局管理员角色。

  • 隐式流返回错误消息

AADB2C90205:此应用程序对此 Web 资源没有足够的权限来执行该操作。

  • 当包含应用程序机密时,授权代码流缺少访问承载令牌。有一个 ID 令牌和一个刷新令牌,但没有访问令牌。无论我是否将授权发送到外部浏览器,都有和没有 PKCE。

我租户中的应用有一个用户流B2C_1_postman,基本上是默认的。它适用于邮递员、其他测试应用程序以及 B2C 管理刀片中的“运行用户流”功能。

身份验证端点是:

https://{Tenant}.b2clogin.com/{Tenant}.onmicrosoft.com/B2C_1_postman/oauth2/v2.0/authorize

令牌端点是:

https://{Tenant}.b2clogin.com/{Tenant}onmicrosoft.com/B2C_1_postman/oauth2/v2.0/token

我已经通过 Microsoft 的 github 存储库中的几个桌面演示复制了这种行为,现在使用 Postman。该应用程序名为“邮递员”,位于 ADB2C 租户中。我授予它以下应用 API 范围:

Directory.AccessAsUser.All
Directory.Read.All
Directory.ReadWrite.All
Directory.email
Directory.offline_access
Directory.profile

此过程反映了https://github.com/Azure-Samples/active-directory-b2c-dotnet-desktop 的桌面演示设置的内容,唯一的例外是我希望我的桌面应用程序使用 MS Graph,而不是 NodeJS 示例应用程序。 (如果我为示例应用添加端点,这个应用注册就可以正常工作。但指定 MS Graph 范围总是返回一个空的访问 ID。)

我怎样才能让它工作?

【问题讨论】:

    标签: microsoft-graph-api azure-ad-b2c


    【解决方案1】:

    通过 Graph API 管理用户似乎仍然需要使用应用程序权限。 因此,您需要添加应用程序权限,而不是在 B2C 中向应用程序添加委派权限,在此您将 Graph API 作为应用程序调用,而不是代表用户。 文档中的说明详细解释了应用注册:https://docs.microsoft.com/en-us/azure/active-directory-b2c/microsoft-graph-get-started

    您需要将此应用应用权限授予 Graph API,而不是委托权限。 然后纯粹使用这些应用程序凭据来调用 Graph API。 并且您需要使用底层 Azure AD 的令牌端点,而不是您的 B2C 策略令牌端点。

    由于您的应用是桌面应用(公共客户端应用),您需要在后端服务中进行 Graph API 交互,您可以使用代表用户获取的 B2C 令牌对其进行身份验证。

    【讨论】:

    • 我知道,但这并不安全。桌面应用程序中的管理员凭据。我还不如只加密一对 guid 而完全忘记 B2C。 (应用程序级范围在 B2C 注册中工作得很好,顺便说一句)该页面上的文本声称可以进行交互式会话。但没有演示。它也是过去用于访问 AD Graph 演示的所有链接现在所在的位置。它还提出了一些问题:为什么要取消以前有效的说明和对文档的访问权限?并且:为什么在 ppl 前面放置一个 UI,暗示不可能的事情是可能的?为什么他们不清楚不能做?
    • 啊,对了,我猜应用权限现在可以在 B2C 注册中使用,因为它们现在是统一的 :) 但是知道你不能在桌面应用中这样做 :\ 肯定会在文档中添加一个问题顺便说一句,如果你发现这样的怪事,请访问页面。团队通常会很好地回答这些问题。
    • 只是意味着我必须构建中间件。由于它与参与 B2C 登录流程的 ASP.NET Core 站点交互,因此我有一个用例和一个放置应用程序机密的位置,但您必须知道,如果他们不领导,这会容易得多我在文档中喜欢这样或移动隐藏以前的东西。尤其是在没有任何指导的情况下。
    • 您介意编辑您的答案以反映应用权限更正吗?那我就标记一下。
    • 固体。谢谢!参考这个问题,我给那里的文档团队留下了一个苦涩的小评论。
    【解决方案2】:

    这里很混乱。 你绝对可以做你想做的事,除了这都是 Azure AD 功能,而不是 Azure AD B2C。因此,您不希望调用任何 B2C 用户流等。B2C 身份验证无法访问 Microsoft API,只能访问您自己的 API。

    • AAD 租户 - 仅包含 AAD 端点。它是一个单一的令牌发行者
    • B2C 租户 - 包含 AAD 和 B2C 令牌端点。分别有两个代币发行者

    一个 B2C 租户包含:

    • AAD 端点:login.microsoftonline.com 未弃用此功能
    • AAD B2C 端点:tenantName.b2clogin.com+ B2C policyId 参数

    根据身份验证请求,将请求路由到两个不同的令牌颁发者。

    下一个关键点:

    • AAD 端点允许您获取受 AAD 应用程序注册保护的应用程序的令牌。
    • AAD 端点允许您获取 Microsoft API 的令牌,因为它们也受我们这边的 AAD 保护。例如 MS Graph API。
    • AAD 端点允许 client_credentials
    • B2C 端点允许您获取仅受 AAD B2C 应用程序注册保护的应用程序的令牌。
    • B2C 端点不允许 client_credentials

    根据上述规则集,您不能使用tenantName.b2clogin.com 获取 MS Graph API 的令牌。
    这意味着用户 B2C 身份验证不能用于授权 AAD 保护的应用程序或 Microsoft API。 (尽管新的 App Reg 体验允许将权限分配给 MS Graph 以进行 B2C 应用程序注册 - 我们正在寻求解决这个问题)。

    当您使用 login.microsoftonline.com 并且未针对 B2C 租户提供任何策略 id 参数时,您点击了 B2C 租户的 AAD 端点,它再次起作用。例如,您可以使用用户上下文获取 Microsoft Graph API 的令牌。

    当您使用tenantName.b2clogin.com 并针对 B2C 租户提供任何策略 id 参数时,您点击了 B2C 租户的 AAD B2C 端点,现在它不会像您预期的那样工作。希望以上能说明原因。并且由于没有弃用 AAD 端点,因此您无需将此域名用于此类呼叫。

    总结是,将您的场景视为纯 Azure AD 场景,根据 sample。您仅为此组织目录中的帐户创建应用程序注册。在提示输入类型时。

    【讨论】:

    • 没有。客户端凭据流有效。在交互式或隐式流中使用 AAD 端点会带您浏览 live.com 的内容,完全绕过 B2C 目录。问题是关于隐式流程。 MS 已经明确弃用了 B2C 的 login.microsoftonline.com。 azure.microsoft.com/en-us/updates/b2c-deprecate-msoldocs.microsoft.com/en-us/azure/active-directory-b2c/b2clogin
    • 它会将您带到 Azure AD 身份验证端点,如果您输入“实时”帐户,它将带您到 live.com 并向租户进行身份验证,如果该帐户作为外部帐户存在于其中(B2B,不是 B2C 帐户)。否则,您将输入一个普通的 Azure AD 帐户 (@onmicrosoft.com),类似于您登录到 Azure 门户以访问/管理您的 AAD B2C 租户的帐户。这也可以是一个真实账户。只有这些帐户在您的方案范围内。 B2C 帐户不在范围内,不适用于这些帐户。
    • 链接这个,因为有重复。 github.com/MicrosoftDocs/azure-docs/issues/56756。那里解释了弃用“问题”。
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多