使用 Azure Active Directory 和 Azure Active Directory B2C 时如何获得标准 OpenID 连接声明?
How can I get the standard OpenID connect claims when using Azure Active Directory and Azure Active Directory B2C?
我们正在使用 IdentityServer 4 as a gateway to other identity providers following the federation gateway architecture.
开发 ASP.NET 核心 2.2 网络应用程序
我们正在开发的应用程序是实际的身份提供者 Web 应用程序,如上所述,它只是一些已配置的上游身份提供者的网关。
用户基本上配置了他首选的上游身份提供者,我们的应用程序负责配置 IdentityServer4,以便配置的提供者用作身份服务器本身的外部身份提供者。
应用程序用户的要求是每个配置的提供者必须符合 OpenID 连接协议。实际上,每个上游提供者都使用 ASP.NET core authentication handler for OpenID connect 向身份服务器 4 注册。
在开发阶段,我们通过使用 Azure active directory B2C and our company's instance of Azure Active Directory 作为测试上游身份提供者来测试应用程序。
我们在身份验证期间要求 3 个不同的范围:openid
、profile
和 email
。
我们这样做是因为我们需要从外部提供者那里获得的唯一用户声明是 sub
(由 openid
范围提供)、given_name
和 family_name
(由 profile
范围提供)和 email
(由 email
范围提供)。 请注意,email
声明对我们来说非常重要,因为我们想将其用作识别系统用户的主键(这与 Azure Active Directory 相关B2C 问题解释如下)。
这些是 standard open id connect scopes and claims,因此我们希望在我们的测试提供商中轻松找到它们。不幸的是,现实情况不同,Azure Active Directory 和 Azure Active Directory B2C 都不会发送
所有这些主张。
我们实际得到的是以下说法:
来自 Azure 活动目录的 sub
、name
和 email
(缺少 given_name
和 family_name
)
sub
、emails
、given_name
和 family_name
来自 Azure 活动目录 B2C(请注意,emails
不是标准声明,来自 Azure门户网站它被分类为 StringCollection,因此似乎可以为一个用户获取多封电子邮件,这不是我们想要的。
我的问题主要有以下几点:
- 是否可以从 Azure Active Directory 和 Azure Active Directory B2C 获得标准的 OpenID 连接
sub
、email
、given_name
和 family_name
声明?是否只是正确配置它们的问题?
- 是否可以假设 任何 声明符合 OpenID 连接的身份提供者能够向我们提供这四个声明? 我们希望避免混淆我们的回退逻辑代码库来处理
不同供应商的细微差别
感谢您的帮助!
您指的是由 OpenID Connect 标准标记为 OPTIONAL
的声明。
就 Azure AD(不是 B2C)而言,这里是文档:
- Tokens and claims in Microsoft Identity Platform(没有 given_name & family_name)
- 关于
given_name
、family_name
、email
检查 optional claims in Azure Active Directory 文档以便将它们包含在您的 id_token
中。
对于 B2C,嗯,真的没有关于它的文档,或者我在查找它时遇到了问题。 This is a general B2C tokens reference doc。但是只需转到您的 user_flow
并为应用程序(依赖方)定义请求的声明:
如何在 B2C 环境中发出电子邮件索赔是一个普遍的挑战。因为您可能有本地用户或社交用户(在您的案例中包括通过 B2C 联合的 Azure AD 用户)甚至远程用户(具有自定义流的更复杂的场景)。所以你并没有真正拥有电子邮件的真实来源。
所谓的名字和姓氏 self asserted
- 最终用户提供信息,您 (B2C) 只需将其保存到个人资料中。因此,您的应用程序正在获取用户提供的信息。它可能是任何东西。
您当然可以创建自定义声明并将其命名为 email
而不是 B2C 中的 emails
。但是您必须最终决定哪个将是此声明的来源。您可以使用 custom flow.
实现该目标
我通常也会反对将电子邮件作为主键甚至是某物的匹配项。有足够多的情况,尤其是在公司内部,员工的电子邮件地址可能而且将会发生变化。并且您的应用程序不应依赖于电子邮件是用户个人资料的不可变 属性 这一事实。
至此,我相信我只回答了问题一。
至于后者:
is it possible to assume that any identity provider declaring of being
compliant with OpenID connect is able to provide us with these four
claims ?
请不要忘记您所指的声明已在 the OpenID Connect specification 中标记为 OPTIONAL
。这意味着身份提供者不必为了与 OpenID Connect 兼容而实施这些。更具体地说,文档指出:
Claims requested by the following scopes are treated by Authorization
Servers as Voluntary Claims.
但是是的 - Azure Active Directory 提供了所有这些 - 以及可选声明的配置。 B2C 还为他们提供了针对 email
声明的更复杂的解决方法。
我们正在使用 IdentityServer 4 as a gateway to other identity providers following the federation gateway architecture.
开发 ASP.NET 核心 2.2 网络应用程序我们正在开发的应用程序是实际的身份提供者 Web 应用程序,如上所述,它只是一些已配置的上游身份提供者的网关。
用户基本上配置了他首选的上游身份提供者,我们的应用程序负责配置 IdentityServer4,以便配置的提供者用作身份服务器本身的外部身份提供者。
应用程序用户的要求是每个配置的提供者必须符合 OpenID 连接协议。实际上,每个上游提供者都使用 ASP.NET core authentication handler for OpenID connect 向身份服务器 4 注册。
在开发阶段,我们通过使用 Azure active directory B2C and our company's instance of Azure Active Directory 作为测试上游身份提供者来测试应用程序。
我们在身份验证期间要求 3 个不同的范围:openid
、profile
和 email
。
我们这样做是因为我们需要从外部提供者那里获得的唯一用户声明是 sub
(由 openid
范围提供)、given_name
和 family_name
(由 profile
范围提供)和 email
(由 email
范围提供)。 请注意,email
声明对我们来说非常重要,因为我们想将其用作识别系统用户的主键(这与 Azure Active Directory 相关B2C 问题解释如下)。
这些是 standard open id connect scopes and claims,因此我们希望在我们的测试提供商中轻松找到它们。不幸的是,现实情况不同,Azure Active Directory 和 Azure Active Directory B2C 都不会发送 所有这些主张。
我们实际得到的是以下说法:
-
来自 Azure 活动目录的
sub
、name
和email
(缺少given_name
和family_name
)sub
、emails
、given_name
和family_name
来自 Azure 活动目录 B2C(请注意,emails
不是标准声明,来自 Azure门户网站它被分类为 StringCollection,因此似乎可以为一个用户获取多封电子邮件,这不是我们想要的。
我的问题主要有以下几点:
- 是否可以从 Azure Active Directory 和 Azure Active Directory B2C 获得标准的 OpenID 连接
sub
、email
、given_name
和family_name
声明?是否只是正确配置它们的问题? - 是否可以假设 任何 声明符合 OpenID 连接的身份提供者能够向我们提供这四个声明? 我们希望避免混淆我们的回退逻辑代码库来处理 不同供应商的细微差别
感谢您的帮助!
您指的是由 OpenID Connect 标准标记为 OPTIONAL
的声明。
就 Azure AD(不是 B2C)而言,这里是文档:
- Tokens and claims in Microsoft Identity Platform(没有 given_name & family_name)
- 关于
given_name
、family_name
、email
检查 optional claims in Azure Active Directory 文档以便将它们包含在您的id_token
中。
对于 B2C,嗯,真的没有关于它的文档,或者我在查找它时遇到了问题。 This is a general B2C tokens reference doc。但是只需转到您的 user_flow
并为应用程序(依赖方)定义请求的声明:
如何在 B2C 环境中发出电子邮件索赔是一个普遍的挑战。因为您可能有本地用户或社交用户(在您的案例中包括通过 B2C 联合的 Azure AD 用户)甚至远程用户(具有自定义流的更复杂的场景)。所以你并没有真正拥有电子邮件的真实来源。
所谓的名字和姓氏 self asserted
- 最终用户提供信息,您 (B2C) 只需将其保存到个人资料中。因此,您的应用程序正在获取用户提供的信息。它可能是任何东西。
您当然可以创建自定义声明并将其命名为 email
而不是 B2C 中的 emails
。但是您必须最终决定哪个将是此声明的来源。您可以使用 custom flow.
我通常也会反对将电子邮件作为主键甚至是某物的匹配项。有足够多的情况,尤其是在公司内部,员工的电子邮件地址可能而且将会发生变化。并且您的应用程序不应依赖于电子邮件是用户个人资料的不可变 属性 这一事实。
至此,我相信我只回答了问题一。
至于后者:
is it possible to assume that any identity provider declaring of being compliant with OpenID connect is able to provide us with these four claims ?
请不要忘记您所指的声明已在 the OpenID Connect specification 中标记为 OPTIONAL
。这意味着身份提供者不必为了与 OpenID Connect 兼容而实施这些。更具体地说,文档指出:
Claims requested by the following scopes are treated by Authorization Servers as Voluntary Claims.
但是是的 - Azure Active Directory 提供了所有这些 - 以及可选声明的配置。 B2C 还为他们提供了针对 email
声明的更复杂的解决方法。