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

时间:2013-05-03 19:43:13

标签: asp.net-mvc-4 facebook-oauth

我是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帐户吗?

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

1 个答案:

答案 0 :(得分: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. 让他们将此与现有的本地帐户相关联,作为注册过程的一部分
  5. 等。

    ASK PERMISSION

    (如果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详细信息传递给该操作
    • 他们被重定向到/Account/ExternalLoginConfirmation并要求为您在网站上的新展示位置提供用户名
    • 如果该用户名可用,则会创建UserProfile和webpages_OAuthMembership条目

    这个过程是你加入"帐户通过匹配一些独特的信息。只要您在UserProfile,webpages_Membership和webpages_OAuthMembership中使用相同的UserId,您就可以了。所以我们必须在/Account/ExternalLoginConfirmation

    点拦截这个过程

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

    但是,我认为您不能/不应该假设用户为您的网站和OAuth使用相同的电子邮件地址,(出于多种原因,您也不应该这样做)。此外,对于类似FacebOogLiveWitter的T& Cs,它可能会阻止你要求他们的帐户的电子邮件,如果他们目前不在将来。

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

    结束

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

    您的流程需要:

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

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

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