当前位置: 首页 > 知识库问答 >
问题:

在使用Azure Active Directory和Azure Active Directory B2C时,如何获取标准OpenID连接声明?

江承嗣
2023-03-14

我们正在开发一个 ASP.NET 核心 2.2 Web 应用程序,方法是使用 IdentityServer 4 作为遵循联合网关体系结构的其他标识提供者的网关。

我们正在开发的应用程序是实际的身份提供者Web应用程序,如上所述,它只是一些配置的上游身份提供者的网关。

用户基本上配置了他首选的上游身份提供程序,我们的应用程序负责配置 IdentityServer4,以便将配置的提供程序用作身份服务器本身的外部身份提供程序。

对应用程序用户的要求是,每个配置的提供者必须符合OpenID连接协议。每个上游提供者实际上都是通过使用OpenID connect的ASP.NET核心认证处理程序向identity server 4注册的。

在开发阶段,我们使用Azure活动目录B2C和我们公司的Azure Active Directory实例作为测试上游标识提供者来测试应用程序。

我们在身份验证期间要求3个不同的范围:openidprofileemail

我们这样做是因为我们需要从外部供应商获得的唯一用户声明是sub(由openid范围提供)、given_namefamily_name(由配置文件范围提供)和email(由email范围提供)。请注意,email声明对我们来说非常重要,因为我们希望将其用作识别系统用户的主键(这与下面解释的Azure Active DirectoryB2C问题相关)。

这些是标准的开放id连接范围和声明,因此我们希望在测试提供商中轻松找到它们。不幸的是,现实情况不同,Azure Active Directory和Azure Active Directory都B2C发送所有这些声明。

我们实际上得到的是以下声明:

  • 来自Azure active directory的subname电子邮件给定_name家族_name缺失)
  • 来自Azure active directory B2C的sub电子邮件given_namefamily_name(请注意,邮件不是标准声明,从Azure门户网站分类为StringCollection,因此似乎可以为一个用户获取多封电子邮件,这不是我们想要的)

我的问题基本上是以下几点:

  • 是否可以从Azure Active Directory和Azure Active Directory B2C获得标准OpenID connect<code>sub<code>和<code>电子邮件<code>以及<code>given_name</code>声明?这只是正确配置它们的问题吗
  • 是否可以假设任何声明符合OpenID connect的身份提供商都能够向我们提供这四项声明?我们希望避免混乱我们的回退逻辑代码库,以处理不同提供者的微妙特殊性

感谢您的帮助!

共有1个答案

岳茂
2023-03-14

您指的是OpenID Connect标准标记为< code >可选的声明。

就 Azure AD(不是 B2C)而言,这是文档:

    < Li > Microsoft Identity Platform中的令牌和声明(无给定名称

对于B2C,嗯,真的没有关于它的文档,或者我在找到它时遇到问题。这是一个通用的 B2C 令牌参考文档。但只需转到user_flow,并为应用程序(信赖方)定义请求的声明:

如何在B2C上下文中发出电子邮件声明存在一个普遍的挑战。因为您可能有一个本地用户,或者一个社交用户(在您的情况中包括B2C联合的Azure AD用户),甚至是一个远程用户(具有自定义流的更复杂的场景)。所以您没有真正的电子邮件来源。

给定姓名和姓氏被称为<code>自断言-最终用户提供信息,您(B2C)只需将其保存到配置文件中。因此,您的应用程序正在获取用户提供的信息。它可能是任何东西。

您当然可以创建自定义声明并将其命名为电子邮件,而不是B2C中的电子邮件。但你必须最终决定哪个将是这个说法的来源。您可以使用自定义流实现该目标。

一般来说,我也反对将电子邮件作为主键,甚至是匹配项。很多情况下,尤其是在公司内部,员工的电子邮件可能会发生变化。您的应用程序不应依赖于电子邮件是用户配置文件的不可变属性这一事实。

因此,我相信我只回答了第一个问题。

至于后者:

是否可以假设任何声明符合OpenID连接的身份提供商都能够为我们提供这四种声明

不要忘记,在OpenID Connect规范中,您引用的声明被标记为< code>OPTIONAL。这意味着身份提供者不必为了符合OpenID Connect而实现这些功能。更具体地说,该文件指出:

授权服务器将下列作用域请求的声明视为自愿声明。

但是,是的,Azure Active Directory提供了所有这些选项,并提供了可选声明的配置。B2C还为他们提供了更为复杂的解决方案,以解决电子邮件索赔问题。

 类似资料:
  • 问题内容: 尝试使用socket.io- client连接到用Go编写的websocket服务器。我已经使用节点WebSocket库(npm)成功连接。因此,有效的Websocket代码如下所示: 非常简单并且有效-另一端的套接字以设定的频率发送消息。但是我最初尝试使用(npm),但是无法继续使用。它肯定将websocket列为其首选传输,但是该死,如果我能连接它的话: 连接永远不会发生,因此不会

  • 现在我正在使用Criteria Hibernate查询从员工表中查询所有记录,它工作正常。我需要将员工表与库表联接,其中库。Emp_Id=员工。Emp_id我是否需要从员工表中获取所有记录,并从库表中获取书名和结账日期,作为联接选择查询的一部分。我该怎么做?

  • 问题内容: 何时使用语句而不是准备语句。我想在没有参数的查询中使用语句,但是为什么不使用预处理语句呢?对于没有参数的查询,哪一个更快。 问题答案: 我想在没有参数的查询中使用语句,但是为什么不使用预处理语句呢? 还差得远 对于返回结果集或更新计数的INSERT,UPDATE和DELETE语句,使用PreparedStatement。正如Joachim所指出的,它们不适用于DDL语句,也不适用于应使

  • 此查询用于检索一对多关系中的最后记录(请参阅SQL连接:选择一对多关系中的最后记录) 我的问题是:如何使用jpa criteria api使用subselect构建这个连接?可能吗?如果没有,可以使用jpql吗? 到目前为止我的代码:

  • 两个数据库表具有外键关系。 它们通过JPA映射到两个实体A和B,但是连接列是从实体中手动删除的,因此在JPA世界中,类A和B是不相关的,您不能通过字段/属性从一个类导航到另一个类。 使用JPA标准API,是否可以创建连接两个表的查询? 我在互联网上找到的所有示例都使用join列来实现目标,但如上所述,它已从代码中删除,因为大多数时候我对A和B之间的关系不感兴趣,而且我担心可能的开销。

  • 只是一个简单的问题。 我一直在网上寻找支持,以创建标准连接帐户与颤振,但我仍然遇到以下问题: \我应该在我的字段中放什么在我的方法中?根据留档,它是: 但它是一款移动应用?所以我有点困惑,我应该把什么放在那里。