使用ASP.NET将多个基于声明的身份提供者与一个用户相关联

时间:2012-06-18 05:19:12

标签: asp.net-mvc-4 claims-based-identity .net-4.5 acs

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

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

2 个答案:

答案 0 :(得分:3)

除了stackoverflow本身之外,还有一个很好的例子。单击您的用户配置文件,然后选择“我的登录”。

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

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

我认为有两种方法可以实现这一目标:

  1. 让您的MVC应用程序保留帐户链接。当用户登录时,您使用第三方唯一ID声明查询您的帐户链接存储,并解析您的网站特定用户ID。

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

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

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

  3. 对于唯一ID输出声明类型,您可以从可用的声明类型中进行选择或指定自己的声明类型。 ACS有一个OData based management service,您可以使用它从MVC应用程序以编程方式创建这些规则。这是一个code sample

答案 1 :(得分:2)

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

  • myemail@gmail.com(电子邮件 - Google) - > (UserId - YourApp)user_1234
  • myotheremail@yahoo.com(email - Yahoo!) - > (UserId - YourApp)user_1234
  • 64746374613847349(NameIdentifier - LiveId) - > (UserId - YourApp)user_1234

您可以通过ACS API自动执行此操作。您还应该在用户首次登录您的站点时处理(例如,询问用户的电子邮件并发送将触发映射的确认消息)。

据推测,您正在使用此信息从应用程序中的本地数据库中检索数据,否则,您只需对索赔中的所有内容进行编码,而不必担心任何等效项。声明通常是编码常见配置文件数据的好地方。 (例如角色等)