外部登录帐户与本地登录帐户

X30*_*61X 5 facebook-oauth asp.net-mvc-4

我全新到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);
Run Code Online (Sandbox Code Playgroud)

oAuthMemebership如果他们选择使用他们的Facebook凭据而不是他们在首次注册时创建的电子邮件和密码,他们可以在未来"升级"到帐户吗?

我在指南或其他地方找不到这个问题的明确答案,所以我希望有人可以澄清这个过程是如何起作用的.

And*_*own 9

SimpleMembership设置允许本地和多个OAuth登录共享相同UserProfile- 因此单个用户可以使用本地密码或FacebOogLiveWitter登录.

(我应该说,我在这个答案中假设OAuth提供商不会发回本地帐户的匹配信息.如果他们这样做,那么实际执行合并的原则是相同的,但复杂性和步骤大大减少.)

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

我将假设您对所发布的链接感到满意,并且您已经关注Facebook帮助(例如)Facebook登录Web登录流程(没有JavaScript SDK),因此您有一个有效的测试应用程序.

您的一般流程必须具有多个用户旅程方法才能对用户有意义:

  1. 登录用户(使用本地帐户)
    1. 让他们登录Facebook并关联帐户
    2. 让他们合并您网站上使用Facebook登录的现有帐户
  2. 登录用户(使用facebook帐户)
    1. 让他们创建一个本地帐户
    2. 让他们合并您网站上的现有本地帐户
  3. 对于尝试注册本地帐户的未登录用户
    1. 让他们将此新帐户与已注册的Facebook登录信息合并,并在注册过程中执行此操作
  4. 对于尝试注册(或首次登录)Facebook帐户的未登录用户
    1. 让他们将此与现有的本地帐户相关联,作为注册过程的一部分

等等

请求许可

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

您应该通过发送到合并目标帐户的电子邮件确认来强制执行确认安全性.除此以外:

  • 有人可以第一次使用Facebook登录您的网站
  • 在此过程中说他们"拥有"本地帐户的电子邮件地址或用户名(请记住,Facebook不一定会确认他们的电子邮件是什么)
  • 因此可以访问现有的本地帐户

因此,一旦合并"请求",您需要请求允许从合并的目标帐户继续.

MVC 4 AccountController

我将使用Facebook作为我们的OAuth示例.要比较在本地身份验证框架和OAuth上注册用户时发生的情况:

  • Local:在webpages_Membership中创建一个条目,在UserProfile中创建一个具有相同UserId的条目(假设您使用的是MVC 4应用程序模板的默认表)
  • OAuth:在webpages_OAuthMembership中创建一个条目,在UserProfile中创建一个具有相同UserId的条目

现在让我们来看看当用户第一次使用Facebook登录时会发生什么:

  • 他们点击登录使用Facebook(或任何你的按钮说)
  • 他们被带到Facebook登录
  • 他们成功了(让我们假设,并忽略失败案例)
  • 他们然后被无形地送到他们身边 /Account/ExternalLoginCallback
  • OAuthWebSecurity.SerializeProviderUserId 被调用,将OAuth详细信息传递给该Action
  • 他们被重定向到/Account/ExternalLoginConfirmation并要求为您在网站上的新展示提供用户名
  • 如果该用户名可用,则创建UserProfile和webpages_OAuthMembership条目

通过匹配一些独特的信息,您可以通过此流程"加入"帐户.只要您UserId在UserProfile,webpages_Membership和webpages_OAuthMembership中使用相同的内容,您就可以了.所以我们必须在这一点上拦截这个过程/Account/ExternalLoginConfirmation.

如果OAuth提供程序已发送回匹配的标识信息(例如电子邮件地址),则此操作变得简单,在ExternalLoginConfirmation操作中对此进行测试,并使用与下面概述的类似过程自动合并.

但是,我认为您不能/不应该假设用户为您的网站和OAuth使用相同的电子邮件地址,(您也不应该出于多种原因).此外,可能在FacebOogLiveWitter之类的条款和条件下,它会阻止你要求他们的帐户的电子邮件,如果他们目前没有,他们可能在将来.

因此,您可以根据用户名,电子邮件地址电话号码等替代方案关联帐户.无论哪种方式,您都需要他们输入一些对帐户唯一的识别信息,并将撤回目标帐户.

包起来

所以把这一切放在一起:在这个答案的第一部分,我概述了如何考虑多个用户旅程来合并帐户.我将使用示例4.1.

您的流程需要:

(假设 - 当用户首次向本地帐户注册时,您要求他们提供电子邮件地址并对其进行验证或假设其有效)

  • 让用户第一次使用Facebook登录
  • Account/ExternalLoginConfirmation问他们是否愿意
    • 与您一起创建一个新帐户
    • 使用他们的Facebook登录访问现有帐户
  • 假设后者,那么您在新表中记录请求(可能是"MergeAccountRequests"):
    • Facebook帐户UserId
    • 目标合并本地帐户UserId
    • 在您需要发送的电子邮件中使用的授权代码(从此时开始,如果他们在未确认合并的情况下登录,则必须将其发送到页面以要求他们确认,而不是在其他数据库表中创建对象你以后要担心)
  • 然后,您发送电子邮件到目标合并(本地)帐户的地址,要求获得完成合并的权限(标准确认电子邮件,带有链接)
  • 当他们点击该链接,或输入您发送的代码(您可以使用短信和电子邮件),然后您需要合并这两个帐户
    • 选择"新"和"目标帐户(在这种情况下,"新"是Facebook帐户,因为您还没有与之关联的数据)
    • 删除"新"帐户的UserProfile
    • 将"新"帐户webpages_OAuthMembership表的UserId更改为与"目标"帐户相同
    • 将用户注销(因此没有复杂情况,具体取决于他们当前登录的帐户)
    • 向用户显示一条消息,告诉他们合并已基本完成,现在他们可以使用任一帐户登录以确认并完成合并

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

  • 感谢此处的详细回复. (3认同)