我是Visual Studio 2012和MVC 4的新手,我一直在通过SimpleMembershipProvider
库使用WebMatrix.WebData
。
我想将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);
如果他们选择使用他们的Facebook凭据而不是他们在首次注册时创建的电子邮件和密码,他们将来可以“升级”为oAuthMemebership
帐户吗?
我无法在指南或其他地方找到这个问题的明确答案,所以我希望有人可以澄清这个过程是如何运作的。
答案 0 :(得分:9)
SimpleMembership设置允许本地和多个OAuth登录共享相同的UserProfile
- 因此单个用户可以使用本地密码或FacebOogLiveWitter登录。
(我应该说,我在这个答案中假设OAuth提供商不会发回本地帐户的匹配信息。如果他们这样做,那么实际执行合并的原则是相同的,但复杂性和步骤大大减少。)
OAuth注册过程将拒绝用户使用现有用户名,而不是尝试合并两个帐户。因此,这并不简单,您必须自己构建功能。这个过程非常复杂,因为用户可以通过许多方向来解决这个问题(因此您可以通过仅支持一个或两个来简化),并且您需要强制执行安全性,以防有人试图合并到他们不在的帐户中。拥有。
我会假设您对所发布的链接感到满意,并且您已经(例如)Facebook Login和The Login Flow for Web (without JavaScript SDK)关注了Facebook帮助,因此您可以正常工作测试应用程序。
您的一般流程必须有多种用户旅程方法才能对用户有意义:
等。
ASK PERMISSION
(如果OAuth提供商已发送回匹配的识别信息,例如电子邮件地址,则可以跳过此步骤。
您应该通过发送到合并目标帐户的电子邮件确认来强制执行确认安全性。否则:
所以,一旦合并"请求"如果已经完成,您需要请求允许从合并的目标帐户继续。
MVC 4 AccountController
我将使用Facebook作为我们的OAuth示例。要比较在本地身份验证框架和OAuth上注册用户时会发生什么:
现在让我们来看看当用户第一次使用Facebook登录时会发生什么:
/Account/ExternalLoginCallback
OAuthWebSecurity.SerializeProviderUserId
,将OAuth详细信息传递给该操作/Account/ExternalLoginConfirmation
并要求为您在网站上的新展示位置提供用户名这个过程是你加入"帐户通过匹配一些独特的信息。只要您在UserProfile,webpages_Membership和webpages_OAuthMembership中使用相同的UserId
,您就可以了。所以我们必须在/Account/ExternalLoginConfirmation
。
如果OAuth提供商已发送回匹配的识别信息(例如电子邮件地址),则此操作变得简单,在ExternalLoginConfirmation
操作中对此进行测试,并使用与此类似的过程进行自动合并概述如下。
但是,我认为您不能/不应该假设用户为您的网站和OAuth使用相同的电子邮件地址,(出于多种原因,您也不应该这样做)。此外,对于类似FacebOogLiveWitter的T& Cs,它可能会阻止你要求他们的帐户的电子邮件,如果他们目前不在将来。
因此,您可以根据备选方案关联帐户,例如用户名或电子邮件地址,或电话号码。无论哪种方式,您都需要他们输入一些对帐户唯一的识别信息,并将撤回目标帐户。
结束
所以将这些全部放在一起:在这个答案的第一部分中,我概述了如何考虑多个用户旅程来合并帐户。我将使用示例4.1。
您的流程需要:
(假设 - 当用户首次向本地帐户注册时,您要求他们提供电子邮件地址并对其进行验证或假设其有效)
Account/ExternalLoginConfirmation
询问他们是否愿意
不是将它们发送到登录页面,而是在确认消息旁边给他们登录选项。