Asp.net mvc 4 外部登录帐户与本机登录帐户

Asp.net mvc 4 外部登录帐户与本机登录帐户,asp.net-mvc-4,facebook-oauth,Asp.net Mvc 4,Facebook Oauth,我是Visual Studio 2012和MVC 4的新手,我一直在通过WebMatrix.WebData库使用SimpleMembershipProvider 我想在将来整合Facebook作为一个外部登录源,但目前还不需要。然而,为了得到一个体面的感觉,它将采取什么,我一直遵循教程和指南找到这里- 我的问题: 如果已使用以下方法创建用户: WebSecurity.CreateUserAndAccount(model.Email, model.Password); WebSecurity.Lo

我是Visual Studio 2012和MVC 4的新手,我一直在通过
WebMatrix.WebData
库使用
SimpleMembershipProvider

我想在将来整合Facebook作为一个外部登录源,但目前还不需要。然而,为了得到一个体面的感觉,它将采取什么,我一直遵循教程和指南找到这里-

我的问题:

如果已使用以下方法创建用户:

WebSecurity.CreateUserAndAccount(model.Email, model.Password);
WebSecurity.Login(model.Email, model.Password);
如果他们选择使用自己的Facebook凭据而不是首次注册时创建的电子邮件和密码,他们将来是否可以“升级”到
OAuthmeebership
帐户


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

SimpleMembership设置允许本地和多个OAuth登录,所有登录都共享相同的
用户配置文件
——因此单个用户可以使用本地密码或FacebOogLiveWitter登录

(我应该指出,我在这个回答中假设OAuth提供者没有为本地帐户发回匹配的信息。如果他们发回匹配的信息,那么实际执行合并的原则是相同的,但是复杂性和步骤大大降低了。)

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

我会假设你对你发布的链接感到满意,并且你已经关注了Facebook的帮助(例如),因此你有一个工作测试应用程序

您的一般流程必须有多个用户旅程方法才能让用户明白:

  • 对于登录用户(使用本地帐户)
  • 让他们登录facebook并关联账户
  • 让他们合并你网站上使用facebook登录的现有帐户
  • 对于登录用户(使用facebook帐户)
  • 让他们创建一个本地帐户
  • 让他们合并站点上现有的本地帐户
  • 对于尝试注册本地帐户的未登录用户
  • 让他们将这个新帐户与已经注册的facebook登录合并,并作为注册过程的一部分
  • 对于尝试注册(或首次登录)facebook帐户的未登录用户
  • 作为注册过程的一部分,让他们将此与现有的本地帐户链接
  • 等等

    请求许可

    (如果OAuth提供程序已发回匹配的标识信息,如电子邮件地址,则可以跳过此操作)

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

    • 有人可以第一次使用facebook登录您的网站
    • 在这个过程中,说他们“拥有”本地帐户的电子邮件地址或用户名(记住,facebook不一定会确认他们给你的电子邮件是什么)
    • 因此可以访问现有的本地帐户
    因此,一旦提出合并“请求”,您需要请求从合并的目标帐户继续进行的权限

    MVC 4 AccountController

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

    • 本地:在webpages_Membership中创建一个条目,并在UserProfile中创建一个具有相同用户ID的条目(假设您使用的是MVC 4应用程序模板的默认表)
    • OAuth:在webpages\u OAuthMembership中创建一个条目,并在UserProfile中创建一个具有相同用户ID的条目
    现在让我们看看当用户第一次使用Facebook登录时会发生什么:

    • 他们使用Facebook(或任何你的按钮)点击登录
    • 他们被带到facebook登录
    • 他们成功了(让我们假设,忽略失败案例)
    • 然后,它们被无形地发送到
      /Account/ExternalLoginCallback
    • 调用
      OAuthWebSecurity.SerializeProviderUserId
      ,将OAuth详细信息传递给该操作
    • 他们被重定向到
      /Account/externalloginconconfirmation
      ,并被要求为他们在您的网站上的新存在提供用户名
    • 如果该用户名可用,则会创建UserProfile和webpages\u OAuthMembership条目
    这个过程是您通过匹配一些独特的信息来“加入”帐户的机会。只要您在UserProfile、webpages\u会员资格和webpages\u OAuthMembership中使用相同的
    UserId
    ,您就可以了。因此,我们必须在
    /Account/externalloginconconfirmation
    点拦截该流程

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

    然而,我认为你不能/不应该假设用户在你的站点和OAuth上使用相同的电子邮件地址(出于许多原因,你也不应该)。另外,在T&C中,FacebOogLiveWitter这样的东西可能会阻止你询问他们帐户的电子邮件,如果他们目前没有,将来可能会这样做

    因此,您可以根据其他选项(如用户名、电子邮件地址或电话号码)链接帐户。不管你走哪条路