6

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

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

4

2 回答 2

3

看看 stackoverflow 本身就是一个很好的例子。单击您的用户配置文件,然后选择“我的登录”。

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

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

我看到了实现这一目标的两种选择:

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

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

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

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

对于唯一 ID 输出声明类型,您可以从可用声明类型中进行选择或指定您自己的声明类型。ACS 有一个基于 OData 的管理服务,您可以使用它从您的 MVC 应用程序中以编程方式创建这些规则。这是一个代码示例

于 2012-06-18T14:45:11.563 回答
2

如果您使用的是 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) user_1234
  • 64746374613847349 (NameIdentifier - LiveId) -> (UserId - YourApp) user_1234

您可以通过 ACS API 自动执行此操作。您可能还应该处理用户第一次登录到您的站点(例如,要求用户提供电子邮件并发送将触发映射的确认消息)。

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

于 2012-06-18T14:52:06.363 回答