Microsoft graph api 请求Microsoft Graph委派权限时,没有为AD B2C用户返回访问令牌

Microsoft graph api 请求Microsoft Graph委派权限时,没有为AD B2C用户返回访问令牌,microsoft-graph-api,azure-ad-b2c,Microsoft Graph Api,Azure Ad B2c,用户故事:给定一个ADB2C用户,具有全局管理员角色,oid为01234567-901a-bcde-f012-3456789abcde不是真实的oid,我希望能够作为该用户登录,并从或检索用户配置文件。这两个都列在文档中,作为B2C的有效端点 它不起作用: 在一个只分配了Microsoft Graph权限范围的应用程序注册中,我使用postman请求访问MS Graph的承载令牌。有一个Web重定向URI、一个客户端机密,并且对访问令牌和id令牌都启用隐式授权 请求的作用域是:openid脱机访

用户故事:给定一个ADB2C用户,具有全局管理员角色,oid为01234567-901a-bcde-f012-3456789abcde不是真实的oid,我希望能够作为该用户登录,并从或检索用户配置文件。这两个都列在文档中,作为B2C的有效端点

它不起作用:

在一个只分配了Microsoft Graph权限范围的应用程序注册中,我使用postman请求访问MS Graph的承载令牌。有一个Web重定向URI、一个客户端机密,并且对访问令牌和id令牌都启用隐式授权

请求的作用域是:openid脱机访问https://graph.microsoft.com/Directory.AccessAsUser.All

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

隐式流返回错误消息 AADB2C90205:此应用程序对此web资源没有足够的权限来执行该操作

当包含应用程序机密时,授权码流缺少访问承载令牌。有一个ID令牌和一个刷新令牌,但没有访问令牌。无论我是否将授权发送到外部浏览器,这都是有PKCE和没有PKCE的情况。 我的租户中的应用程序有一个用户流,B2C_1_postman,这基本上是默认的。它可以与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
令牌端点是:

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
我在微软github存储库的几个桌面演示中复制了这种行为,现在又在Postman中进行了演示。这款名为postman的应用程序位于ADB2C租户中。我授予它以下应用程序API范围:

Directory.AccessAsUser.All
Directory.Read.All
Directory.ReadWrite.All
Directory.email
Directory.offline_access
Directory.profile
这个过程反映了桌面演示的设置,唯一的例外是我希望我的桌面应用程序使用MS Graph,而不是NodeJS示例应用程序。如果我为示例应用添加端点,则此应用注册工作正常。但是指定MS Graph作用域总是返回一个空的访问ID


我怎样才能让它工作

通过Graph API管理用户似乎仍然需要使用应用程序权限。 因此,与在B2C中向应用程序添加委派权限不同,您需要添加应用程序权限,即您将Graph API作为应用程序调用,而不是代表用户。 文档中的说明详细解释了应用程序注册:

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


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

通过Graph API管理用户似乎仍然需要使用应用程序权限。 因此,与在B2C中向应用程序添加委派权限不同,您需要添加应用程序权限,即您将Graph API作为应用程序调用,而不是代表用户。 文档中的说明详细解释了应用程序注册:

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

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

。 你完全可以做你想做的事情,除了这是Azure的所有广告功能,而不是Azure的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端点允许客户端\u凭据 B2C端点允许您获得仅受AAD B2C应用程序注册保护的应用程序令牌。 B2C终结点不允许客户端凭据 根据上述规则集,您不能使用tenantName.b2clogin.com为MS Graph API获取令牌。 这意味着一个用户B2 C身份验证不能用于授权受AAD保护的应用程序或Microsoft API。尽管新的Appreg体验允许为MS Graph分配B2C应用程序注册的权限,但我们正在寻找解决方案

当您使用login.microsoftonline.com并且没有针对B2C租户提供任何策略id参数时,您会访问B2C租户的AAD端点,这同样有效。例如,可以使用用户上下文将令牌获取到Microsoft Graph API

当您使用tenantName.b2clogin.com并针对B2C租户提供任何策略id参数时,您会访问B2C租户的AAD B2C端点,现在它将无法按预期工作。希望以上能澄清原因。而且,由于没有对AAD端点的弃用,您不需要为这种类型的调用使用此域名

总结是,将您的场景视为纯Azure广告场景,如下所示。您只能为此组织目录中的帐户创建应用程序注册。当提示输入类型时。

此处出现大量混乱。 你完全可以做你想做的事情,除了这是Azure的所有广告功能,而不是Azure的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端点允许客户端\u凭据 B2C端点允许您获得仅受AAD B2C应用程序注册保护的应用程序令牌。 B2C终结点不允许客户端凭据 根据上述规则集,您不能使用tenantName.b2clogin.com为MS Graph API获取令牌。 这意味着用户B2C身份验证不能用于授权受AAD保护的应用程序或Microsoft API。尽管新的Appreg体验允许为MS Graph分配B2C应用程序注册的权限,但我们正在寻找解决方案

当您使用login.microsoftonline.com并且没有针对B2C租户提供任何策略id参数时,您会访问B2C租户的AAD端点,这同样有效。例如,可以使用用户上下文将令牌获取到Microsoft Graph API

当您使用tenantName.b2clogin.com并针对B2C租户提供任何策略id参数时,您会访问B2C租户的AAD B2C端点,现在它将无法按预期工作。希望以上能澄清原因。而且,由于没有对AAD端点的弃用,您不需要为这种类型的调用使用此域名


总结是,将您的场景视为纯Azure广告场景,如下所示。您只能为此组织目录中的帐户创建应用程序注册。当提示输入类型时。

我知道,但它不安全。桌面应用程序中的管理员凭据。我也可以只加密一对guid,完全忘记B2C。应用程序级别的作用域在B2C注册中运行良好,顺便说一句,该页面上的文本声称可以进行交互式会话。但没有演示。它也是所有用来连接到广告图演示的链接现在都去了的地方。它还提示了一些问题:为什么要删除以前使用过的说明和文档?还有:为什么要在ppl前面放一个UI,暗示一些不可能的事情是可能的?为什么他们不清楚这不能做到?啊,对了,我想应用权限现在在B2C注册中起作用了,因为它们现在是统一的:但是,是的,你知道你不能在桌面应用中做到这一点:\n顺便说一句,如果你发现这样的怪事,一定要在文档页面上添加一个问题。团队通常会很好地回答这些问题。这意味着我必须构建中间件。由于它与参与B2C登录流的ASP.NET核心站点相连接,我有一个用例和一个地方可以将应用程序保密,但你必须知道,如果他们不在文档中这样引导我,或者隐藏以前的内容,这会容易得多。尤其是在没有任何指导的情况下。您介意编辑您的答案以反映应用程序权限更正吗?那我就把它标出来。非常感谢。我向那里的docs团队留下了一点尖刻的评论,提到了这个问题。我知道这一点,但这并不安全。桌面应用程序中的管理员凭据。我也可以只加密一对guid,完全忘记B2C。应用程序级别的作用域在B2C注册中运行良好
顺便说一句,该页面上有文字声称可以进行交互式会话。但没有演示。它也是所有用来连接到广告图演示的链接现在都去了的地方。它还提示了一些问题:为什么要删除以前使用过的说明和文档?还有:为什么要在ppl前面放一个UI,暗示一些不可能的事情是可能的?为什么他们不清楚这不能做到?啊,对了,我想应用权限现在在B2C注册中起作用了,因为它们现在是统一的:但是,是的,你知道你不能在桌面应用中做到这一点:\n顺便说一句,如果你发现这样的怪事,一定要在文档页面上添加一个问题。团队通常会很好地回答这些问题。这意味着我必须构建中间件。由于它与参与B2C登录流的ASP.NET核心站点相连接,我有一个用例和一个地方可以将应用程序保密,但你必须知道,如果他们不在文档中这样引导我,或者隐藏以前的内容,这会容易得多。尤其是在没有任何指导的情况下。您介意编辑您的答案以反映应用程序权限更正吗?那我就把它标出来。非常感谢。我已经向那里的docs团队留下了一点尖刻的评论,提到了这个问题。没有。客户端凭据流可以工作。在交互式或隐式流中使用AAD端点可以让您浏览live.com内容,完全绕过B2C目录。问题是关于隐式流。微软显然不赞成将login.microsoftonline.com用于B2C,它会将您带到Azure AD authentication endpoint,如果您输入一个“live”帐户,它会将您带到live.com并向租户验证您的身份,如果该帐户作为外部B2B帐户而不是B2C帐户存在于其中。否则,您将输入一个普通的Azure AD帐户@onmicrosoft.com,类似于您登录Azure门户以访问/管理AAD B2C租户的帐户。这也可以是一个实时账户。只有这些帐户在您的场景范围内。B2C帐户不在范围内,它不会与这些帐户一起工作。链接此帐户,因为存在重复。这里解释了弃用“问题”。没有。客户端凭据流可以工作。在交互式或隐式流中使用AAD端点可以让您浏览live.com内容,完全绕过B2C目录。问题是关于隐式流。微软显然不赞成将login.microsoftonline.com用于B2C,它会将您带到Azure AD authentication endpoint,如果您输入一个“live”帐户,它会将您带到live.com并向租户验证您的身份,如果该帐户作为外部B2B帐户而不是B2C帐户存在于其中。否则,您将输入一个普通的Azure AD帐户@onmicrosoft.com,类似于您登录Azure门户以访问/管理AAD B2C租户的帐户。这也可以是一个实时账户。只有这些帐户在您的场景范围内。B2C帐户不在范围内,它不会与这些帐户一起工作。链接此帐户,因为存在重复。这里解释了弃用“问题”。