Asp.net mvc 4 将多个基于声明的身份提供程序与ASP.NET关联到一个用户

Asp.net mvc 4 将多个基于声明的身份提供程序与ASP.NET关联到一个用户,asp.net-mvc-4,claims-based-identity,.net-4.5,acs,Asp.net Mvc 4,Claims Based Identity,.net 4.5,Acs,在使用.NET 4.5框架和Azure访问控制服务(ACS)的ASP.NET MVC 4应用程序中,我希望为用户提供多种身份验证可能性(即Google、Facebook、Windows Live等)。将单个用户与多个身份提供者关联的“最佳实践”是什么 例如,假设用户某天使用谷歌登录,第二天转到另一个浏览器并使用Facebook登录。我如何知道将Facebook登录与之前的Google登录关联到同一用户?请查看stackoverflow本身,了解这方面的一个好例子。单击您的用户配置文件,然后选择“

在使用.NET 4.5框架和Azure访问控制服务(ACS)的ASP.NET MVC 4应用程序中,我希望为用户提供多种身份验证可能性(即Google、Facebook、Windows Live等)。将单个用户与多个身份提供者关联的“最佳实践”是什么


例如,假设用户某天使用谷歌登录,第二天转到另一个浏览器并使用Facebook登录。我如何知道将Facebook登录与之前的Google登录关联到同一用户?

请查看stackoverflow本身,了解这方面的一个好例子。单击您的用户配置文件,然后选择“我的登录”

当用户创建其帐户时,他们会选择要用于登录的身份提供程序。在后台,您的应用程序会创建一个新的特定于站点的唯一用户ID,并将其与第三方提供的唯一ID链接。(您可以使用电子邮件,但大多数身份提供商也会提供一个唯一的用户ID声明,该声明不会更改,即使用户更改了他们的电子邮件)

现在,在用户登录后,他们拥有一个帐户管理控制面板,通过该面板,他们可以建立到其他身份提供者的附加链接

我认为实现这一目标有两种选择:

  • 让您的MVC应用程序保留帐户链接。当用户登录时,您可以使用第三方唯一ID声明查询您的帐户链接商店,并解析特定于站点的唯一用户ID

  • 使用ACS规则引擎。您将为每个帐户链接创建一个规则。例如,假设我可以使用gmail或liveid登录,我的唯一id是1234。两条规则如下所示:

    • 谷歌+me@gmail.com-->输出用户ID声明1234

    • liveId+me@live.com-->输出用户ID声明1234


  • 对于唯一ID输出索赔类型,您可以从可用索赔类型中选择或指定自己的索赔类型。ACS有一个可用于从MVC应用程序以编程方式创建这些规则的。这里有一个。

    如果您使用的是ACS,您可以使用ACS上的声明转换将每个IdP(如Gogle、Yahoo!、FB等)的信息转换为公共句柄。人们常用的一种处理方式是用户电子邮件。但是,如果您想接受许多映射到同一用户的电子邮件,那么您应该引入自己的唯一id(作为声明),并将IdP提供的声明映射到其中:

    • myemail@gmail.com(e-mail-Google)->(UserId-YourApp)user_1234
    • myotheremail@yahoo.com(email-Yahoo!)->(UserId-YourApp)用户
    • 64746374613847349(NameIdentifier-LiveId)->(UserId-YourApp)用户_1234
    您可以通过ACSAPI实现自动化。您可能还应该处理用户第一次登录您的站点时的问题(例如,向用户请求电子邮件并发送将触发映射的确认消息)


    假设您正在使用这些信息从应用程序中的本地数据库检索数据,否则,您可以对声明中的所有内容进行编码,而不必担心任何等价性。声明通常是对公共配置文件数据进行编码的好地方。(例如角色等)

    对于ACS规则引擎,ACS中是否存在某种持久性存储,允许我通过规则将已知的站点特定Id与IdP Id关联起来?我还没有看到。ACS规则引擎实际上是您的持久性存储,因为它将持久化您添加到其中的规则。但是,您不能链接ACS规则引擎以从外部数据存储获取声明(就像您可以使用ADFS一样)。我的想法是使用特定于应用程序的数据库来保存特定于用户的数据(换句话说,声明)。使用基于.net 4.5声明的身份功能,我是否可以接受ACS为我生成的声明并向其中添加一些自定义声明(一旦我将IdP身份与站点特定的身份相关联)?您可以在应用程序中添加自定义声明(请参阅“ClaimsAuthenticationManager”),或者您可以将这些自定义声明存储在ACS本身中。(作为规则:myemail@yahoo.com->(SomeClaim)somevalue)。以下是ClaimsAuthnManager的链接: