【问题标题】:Integration of Facebook and asp.net membershipFacebook 和 asp.net 会员的整合
【发布时间】:2011-09-02 21:38:30
【问题描述】:

我想允许用户使用 Facebook 注册我的网站。我已经在客户端使用 JS SDK 进行身份验证和授权,并在服务器端使用 C# sdk 来获取完成用户配置文件所需的所有信息。 我的问题是我命令允许用户使用他的 Facebook 帐户登录,我需要在我的会员提供商中为他创建一个用户名和密码。 我已经决定使用 Facebook 电子邮件作为用户名,但我能对密码做些什么呢?我以后如何验证他的身份?

谢谢!

编辑:我实际上要问的是:一旦用户第一次通过 Facebook 进行身份验证并且我拥有了他的所有信息,我将如何将该信息映射到会员用户(在用户名和密码条款)以及下次他想用他已经创建的用户登录时,我将如何让他重新登录(在响应中向他发送一个 memebrship cookie)。我知道我每次都需要通过 facebook 进行身份验证,但我正在考虑如何处理 asp.net 会员方面,而不是 Facebook 方面的事情。对不起,如果我之前不清楚:)

【问题讨论】:

    标签: .net asp.net asp.net-membership facebook-c#-sdk


    【解决方案1】:

    Facebook 使用OAuth 2.0。对用户进行身份验证的唯一方法是将用户发送到 Facebook 登录页面,然后使用他们的 OAuth 实现重定向回来。这实际上为您提供了用户特定的时间限制access_token

    它并不适合 MembershipProviders,尽管可以请求 offline_access permission,它允许您随时代表用户执行授权请求。用户必须同意这一点。 Facebook 的条款和条件是,您不能因为不同意扩展权限而拒绝用户访问您的网站,因此这再次打破了模式。

    我并不是说这不可能,只是看起来不值得付出努力。您最好只使用没有成员资格的表单身份验证部分。基于 facebook access_token 设置 auth cookie 和验证 auth cookie。

    要使用 Facebook 进行身份验证,请查看开源 .NET OAuth 库。我还写了一篇关于 Facebook 集成的文章,其中展示了一些集成技术(和观点)here

    更新根据您修改的问题:

    使用表单身份验证 cookie 来存储您选择的唯一标识符(例如 Facebook 用户名)。您还可以将当前的access_token 存储在 cookie 中。

    if (OAuth.ValidateUser(username, user_access_token))
    {  
      // store the user access token to make it available on each request
      string userData = user_access_token;
    
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1,                                     // ticket version
        username,                              // authenticated username
        DateTime.Now,                          // issueDate
        DateTime.Now.AddMinutes(30),           // expiryDate
        isPersistent,                          // true to persist across browser sessions
        userData,                              // can be used to store additional user data
        FormsAuthentication.FormsCookiePath);  // the path for the cookie
    
      // Encrypt the ticket using the machine key
      string encryptedTicket = FormsAuthentication.Encrypt(ticket);
    
      // Add the cookie to the request to save it
      Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket));
    
      // Your redirect logic
      Response.Redirect(FormsAuthentication.GetRedirectUrl(username, isPersistent));
    }
    

    然后覆盖身份验证请求以读取 cookie 并检索用户详细信息。

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookie[FormsAuthentication.FormsCookieName];
        if(authCookie != null)
        {
            //Extract the forms authentication cookie
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    
            // If caching roles in userData field then extract
            string user_access_token = authTicket.UserData;
    
            // Create the IIdentity instance, maybe use a custom one
            // possibly retrieve extra data from database or whatever here
            IIdentity id = new FacebookIdentity( authTicket, user_access_token );
    
            // Create the IPrinciple instance
            IPrincipal principal = new GenericPrincipal(id, new string[]{});
    
            // Set the context user 
            Context.User = principal;
        }
    }
    

    然后在每个请求的代码中:

    var username = Context.User.Identity.Username;
    // implement as an extension method on IIdentity which types to
    // FacebookIdentity to get user_access_token
    var user_access_token = Context.User.Identity.Access_Token;
    

    【讨论】:

    • 对不起,如果我不清楚。这不是我有问题的部分。我编辑了帖子以详细说明。
    • 感谢您的信息。我查了这些功能。仅使用 FormsAuthentication.SetAuthCookie 是否足以让用户从服务器端登录?我已经有一个提供商,我使用 Facebook 只是为了一键注册。我不需要 Facebook 的任何其他内容。
    • 可以,但您只能为标识符存储一个字段。我想你真的想保留access_tokenusername。当然你可以只用| 对它们进行分隔,但不是那么干净。
    • 我想为每个注册 Facebook 的用户创建一个永久会员。之后,我使用 Facebook 来确保我正在验证正确的用户,然后通过 SetAuthCookie 对他们进行身份验证。为什么需要存储令牌?
    • 如果您希望通过 API 以该用户身份与 Facebook 交互,则需要存储令牌。 Purhaps 我想念你的意图,最近我自己做的太多了。要纯粹为了验证而映射用户,那么只需调用FormsAuthentication.SetAuthCookie。这就是上述标准版本在整个会话中保持登录的机制。
    【解决方案2】:

    1 选项:您应该生成一个密码并通过电子邮件发送给用户,例如:

    欢迎来到我的superwebsite.com,登录:foo@foo.com 密码:dhyfd46

    然后,如果您看到密码是原始密码(生成的),请让用户将其更改为另一个密码。

    第二个选项:你永远不会使用密码,对你来说,一个帐户是一个元组(facebookID,电子邮件)(你将从 facebook Api 获得它),如果它匹配这个(用户将点击 om'login with facebook',您将能够创建用户会话

    编辑后:

    为什么不使用元组 (userId,facebookId),如果你有 fb Id 你知道 userId?

    【讨论】:

    • 猜猜我可以这样做,但我已经知道它是用户,只要我有一个令牌,所以没有办法让我在服务器端登录用户并返回响应中的cookie而不需要密码?
    • 只是想添加通过电子邮件以明文形式发送用户密码是非常不安全的。在任何情况下我都不会推荐它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多