2013-05-03 175 views
5

我是Visual Studio 2012和MVC 4的新品牌,我一直在通过WebMatrix.WebData库与SimpleMembershipProvider合作。外部登录帐户与本地登录帐户

我想将Facebook作为外部登录源整合到路上,但这不是现在的要求。然而,为了体会一下它会花费什么,我一直在关注这里找到的教程和指南 - http://www.asp.net/mvc/tutorials/mvc-4/using-oauth-providers-with-mvc

我的问题:

如果用户已经使用创建:

WebSecurity.CreateUserAndAccount(model.Email, model.Password); 
WebSecurity.Login(model.Email, model.Password); 

对它们进行“升级”到oAuthMemebership帐户在未来,如果他们选择使用他们的Facebook凭证,而不是他们在首次注册时创建的电子邮件和密码?

我在指南或其他地方找不到明确的答案,所以我希望有人能够澄清这个过程如何工作。

+1

我想你处理不兼容的类型。您可以拥有简单会员资格,您可以拥有OAuth,也可以使用BOTH。 – 2013-05-09 00:04:30

+0

@DaveA。我很困惑。如果你可以有“A”或“B”或“A和B”,它们如何不相容? – 2013-05-13 11:17:25

+0

@AndyBrown你可以种植一棵橘子树。你可以种植一棵苹果树。你可以种植一棵橘子树和一棵苹果树。你不能种植苹果橙树。 – 2013-05-13 11:28:01

回答

9

SimpleMembership设置允许本地和多个OAuth登录全部共享UserProfile - 因此单个用户可以使用本地密码或FacebOogLiveWitter登录。 (我应该说,我在这个答案中假设OAuth提供者不会为本地帐户发送匹配的信息片段,如果他们这样做,那么实际执行合并的原则是相同的,但复杂性和步骤大大减少)。

如果用户使用现有用户名而不尝试并合并两个帐户,OAuth注册过程将拒绝用户。因此,这并不简单,你必须自己构建功能。这个过程很复杂,因为用户可以通过很多方向来解决这个问题(所以你可以简化为只支持一个或两个),并且还需要强制执行安全措施,以防有人试图合并到他们不拥有的帐户中。

我会假设您对您发布的链接感到满意,并且您已经在(例如)Facebook LoginThe Login Flow for Web (without JavaScript SDK)之后跟随Facebook帮助,因此您有一个正在运行的测试应用程序。

你的一般过程可以拥有多个用户出行方式是有意义的用户:

  1. 一个登录的用户(使用本地帐户)
    1. 让他们登录到Facebook和关联的账户
    2. 让他们合并它使用Facebook登录
  2. 的登录用户(用Facebook帐户)在您的网站的现有帐户
    1. 让他们创建一个本地帐户
    2. 让他们在您的网站
  3. 合并现有的本地帐户登录的用户非谁试图注册一个本地帐户
    1. 让他们合并本具有已登记的Facebook登录名的新帐户,并将其作为登记过程的一部分
  4. 对于试图注册(或登录È第一次用)Facebook帐户
    1. 让他们作为注册过程

ASK PERMISSION的部分与现有的本地帐户链接此

(如果OAuth提供商发回了匹配的识别信息(如电子邮件地址),则可以跳过此步骤)。

您应该强制执行确认安全性,通常通过电子邮件确认发送到合并目标帐户。否则:

  • 有人能在这个过程登录到您的网站与Facebook首次
  • 说,他们“自己”的电子邮件地址或本地帐户的用户名(记住,Facebook将不一定证实了他们的电子邮件是给你的)
  • ,因此访问现有的本地帐户

所以,一旦合并“请求”后,您需要将要求允许从目标账户的合并进行。

的MVC 4的AccountController

我将使用Facebook作为我们的OAuth的例子。比较在本地认证框架上注册用户时发生的情况与OAuth的:

  • 地方:创建于webpages_Membership和条目与用户配置相同的用户ID的条目(假设你正在使用的MVC 4应用程序模板默认表)
  • 的OAuth:创建于webpages_OAuthMembership一个条目,在用户配置使用相同的用户ID的条目

现在,让我们看看会发生什么,当用户在标志使用Facebook的首次:

  • 他们在登录点击使用Facebook的(或任何你的按钮说)
  • 他们得到带到Facebook的登录
  • 他们成功了(让我们假设,而忽略了失败的情况下)
  • 他们随后被发送,无形中给他们,/Account/ExternalLoginCallback
  • OAuthWebSecurity.SerializeProviderUserId被调用时,传递OAuth详细资料到行动
  • 他们重定向到/Account/ExternalLoginConfirmation并要求为他们提供新的在线用户名在您的网站
  • 如果该用户名可用,则用户配置一个nd webpages_OAuthMembership条目创建

此过程是您通过匹配一些独特的信息“加入”帐户的机会。只要你在UserProfile,webpages_Membership和webpages_OAuthMembership中使用相同的UserId,你应该没问题。所以我们必须截取/Account/ExternalLoginConfirmation这一点的过程。

如果OAuth提供商发回了匹配的标识信息(如电子邮件地址),则此操作变得简单,请在ExternalLoginConfirmation操作中对此进行测试,并使用与下面列出的类似流程进行自动合并。

但是,我认为您不能/不应该假设用户使用相同的电子邮件地址为您的网站和OAuth,(也应该你有很多原因)。此外,可能在TC中的FacebOogLiveWitter这样的东西,它会阻止你要求他们的帐户的电子邮件,如果他们目前还没有,他们可能在将来。

因此,相反,你可以链接基于替代账户,如用户名电子邮件地址,电话号码。无论哪种方式,您都需要他们输入一些对帐户唯一的识别信息,并将撤回目标帐户。

结束语

所以把这个放在一起:在这个答案我概述你将如何需要考虑多个用户的旅程合并账户的第一部分。我将使用示例4.1。

你的过程将需要:

(假设 - 当与本地帐户的用户首次注册,你问他们的电子邮件地址和验证,或认为它是有效的)

  • 设与Facebook用户登录首次
  • Account/ExternalLoginConfirmation问他们是否想
    • 与您
    • 创建一个新帐户使用他们的Facebook登录访问现有帐户
  • 假设是后者,那么你登录一个新表(也许“MergeAccountRequests”)的请求搭配:
    • 的Facebook帐户用户ID
    • 目标合并本地帐户用户ID
    • 的授权码在您需要发送 (从这点上,如果他们登录不确认合并电子邮件的使用,他们将不得不被发送到一个页面,要求他们确认,而比在其他数据库表中创建对象,你稍后必须担心)
  • 然后,您发送电子邮件至目标合并的地址(本地)占请求允许完成合并(一个标准的确认电子邮件,链接)
  • 当他们点击该链接,或输入您发送给他们的代码(您可以使用短信以及电子邮件),那么您需要合并这两个帐户
    • 选择“新”和“目标帐户(在这种情况下,”新“是facebook帐户因为你没有用它尚未关联的数据)
    • 删除“新”账户的用户配置
    • 更改“新”账户webpages_OAuthMembership表的用户ID,以同为“目标”占
    • 注销用户(所以有因无并发症的占他们目前正在与登录)
    • 显示告诉他们一个消息给用户的合并几乎是完全的,而且他们现在可以登录任一帐户确认并完成合并

而不是将它们发送到登录页面,我会给他们登录选项旁边的确认消息。

+3

感谢您的详细回复。 – X3074861X 2013-05-13 14:35:12

+0

很好的解释。我们可以为一个用户使用多个外部登录吗?我有谷歌,脸谱,LinkedIn帐户具有相同的电子邮件地址。现在,我可以使用所有这些外部帐户登录到任何OAuth应用程序吗? – Venky 2017-02-13 13:34:45