我们正在通过使用IdentityServer 4作为通往federation gateway architecture之后的其他身份提供者的网关来开发ASP.NET core 2.2 Web应用程序。
我们正在开发的应用程序是实际的身份提供程序Web应用程序,如上所述,它只是通往某些已配置的上游身份提供程序的网关。
用户基本上配置了他首选的上游身份提供者,我们的应用程序负责配置IdentityServer4,以便将配置的提供者用作身份服务器本身的外部身份提供者。
对应用程序用户的要求是,每个配置的提供程序都必须符合OpenID连接协议。实际上,每个上游提供者都通过使用ASP.NET core authentication handler for OpenID connect向身份服务器4注册。
在开发阶段,我们通过使用Azure active directory B2C和我们公司的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都不发送 所有这些主张。
我们实际得到的是以下主张:
sub
,name
和email
(缺少given_name
和family_name
)sub
,emails
,given_name
和family_name
来自Azure活动目录B2C(请注意emails
不是标准声明,而来自Azure门户被归类为 StringCollection ,因此似乎有可能为用户收到多封电子邮件,这不是我们想要的。我的问题基本上是以下问题:
sub
,email
,given_name
和family_name
声明?仅仅是正确配置它们的问题吗?感谢您的帮助!
答案 0 :(得分:1)
您指的是被OpenID Connect标准标记为OPTIONAL
的声明。
关于Azure AD(不是B2C),请参见文档:
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来实现该目标。
我通常也会反对电子邮件是主键甚至是某些东西的匹配。有足够的情况,尤其是在公司内部,当员工的电子邮件可能并且会更改时。并且您的应用程序不应依赖于电子邮件是用户配置文件的不变属性这一事实。
有了这个,我相信我只回答了一个问题。
至于后者:
是否有可能假设任何身份提供者声明为 符合OpenID connect能够为我们提供这四个 索赔?
请不要忘记,您引用的声明在the OpenID Connect specification中标记为OPTIONAL
。这意味着身份提供者不必为了实现OpenID Connect兼容而实现这些功能。更具体地说,文档指出:
以下范围要求的索赔由授权处理 服务器作为自愿索偿。
但是,是的-Azure Active Directory为所有这些提供了-可选声明的配置。而且B2C还为它们提供了-为email
声明提供了更复杂的解决方法。