0

我喜欢与asp会员一起工作,我需要FB集成在一个网站上,所以我不想混合它们。这就是我打算做:
这是一个很好的方法来混合FB连接和ASP会员?

1) Implement method that get data from user FB account (firstname, lastname, username, email) 
2) When I get the data, use asp membership CreateUser() method to make user in database 
3) Send user temporary password to email 

我打算使用电子邮件从FB作为用户名,使用户可以通过FB按钮或通过输入自己的电子邮件地址和密码登录。
问题
- 我有时会从fb收到用户电子邮件的null;如果电子邮件可以是空的,我不能用它来使会员用户。
- 这是同时使用memership和fb的好方法吗?

回答

1

3)发送用户的临时密码的电子邮件

我打算使用电子邮件从FB作为用户名,使用户可以通过FB按钮或通过输入自己的电子邮件地址和密码登录。

我不会给他们发送密码。什么,这只是另一个合理的信息通过不安全的电子邮件发送。相反,如果他们通过Facebook登录我们的网站,那么我给他们设置密码的功能。如果他们选择这样做,他们也可以用他们的用户名和密码登录 - 如果没有,他们仍然可以通过Facebook登录。

我刚刚检查过我们的数据库 - 看起来几乎那些使用我们的网站FB登录有设置密码是那些,其占我们实现了FB登录之前已经存在的唯一用户。在通过FB登录时,帐户创建了,似乎只有少数人设置了密码。他们为什么要这样?他们已经选择使用FB登录注册一个帐户以方便 - 为什么现在通过设置另一个想要记住的密码来破坏它?

我有时会从用户电子邮件的fb收到null;如果电子邮件可以是空的,我不能用它来使会员用户。

我听说过这个电子邮件被空问题,虽然还没有遇到过它自己还。显然这源于电子邮件地址不是强制创建FB账户的时间,您也可以使用您的电话号码。

但在这种情况下,你仍然有他们的用户名,这样你就可以代替用户名 @ facebook.com失踪的电子邮件地址 - Facebook最近进行设置,使每个用户现在拥有这个电子邮件地址。

这是一个同时使用memership和fb的好方法吗?

我在我们的网站上以几乎相同的方式做到这一点。如果有人通过FB登录,我检查数据库,如果我们的系统中FB userid和用户帐户之间已经有连接;如果是这样,我登录该用户帐户,如果没有,我创建一个新的。工作正常。

0

这里是我是如何做到的(也许不是最好的方法,但它的工作原理):

  1. 我创建标准memebership表
  2. 2.添加另一个表,我将用户链接到正常标识的,而不是GUID的,所以我没有把中的GUID网址时,有人想看到的用户配置文件,我也有现场显示名称,让多个用户可以有相同的显示名称

  3. 使用和OpenID库C#

  4. Addding下面的代码片段(这还没有完成,但它的工作原理),以帐户控制:

[AllowAnonymous] 
     public ActionResult LoginOpenID(string provider, string returnUrl) 
     { 
      using (var openid = new OpenIdRelyingParty()) 
      { 
       var response = openid.GetResponse(); 

      if (response == null) 
      { 
       try 
       { 
        var request = openid.CreateRequest(provider); 

        var fetchRequest = new FetchRequest(); 

        fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 

        fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.Alias); 

        fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.FullName); 

        request.AddExtension(fetchRequest); 

        request.AddCallbackArguments("returnUrl", returnUrl); 

        return request.RedirectingResponse.AsActionResult(); 

       } 
       catch (ProtocolException pExp) 
       { 

       } 
       catch (WebException Wexp) 
       { 

       } 
       catch (ArgumentException aexp) 
       { 
       } 
      } 

      else 
      { 
       switch (response.Status) 
       { 
        case AuthenticationStatus.Authenticated: 

         var fetch = response.GetExtension<FetchResponse>(); 

         string alias = fetch.GetAttributeValue(WellKnownAttributes.Name.Alias); 

         string email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email); 

         string fullname = fetch.GetAttributeValue(WellKnownAttributes.Name.FullName); 

         if (string.IsNullOrEmpty(alias)) 

          alias = response.ClaimedIdentifier; 

         if (alias.Contains("google")) 
         { 
          Random random = new Random(); 

          int randomNumber = random.Next(1000000000); 

          alias = "user" + randomNumber; 
         } 

         if (string.IsNullOrEmpty(email)) 

          email = response.ClaimedIdentifier; 

         //Now see if the user already exists, if not create them 

         if (email.Contains("gmail.com") && Membership.FindUsersByEmail(email).Count > 0) 
         { 
          var cookie = FormsAuthentication.GetAuthCookie(Membership.GetUserNameByEmail(email), true); 

          Response.AppendCookie(cookie); 
         } 

         else if (Membership.GetUser(response.ClaimedIdentifier) == null && Membership.FindUsersByEmail(email).Count == 0) 
         { 

          MembershipCreateStatus membershipCreateStatus; 

          string password = GetRandomString(6, 9); 

          MembershipUser user = Membership.CreateUser(response.ClaimedIdentifier.ToString(), 

           password, 

           email, 

           "This is an OpenID account. You should log in with your OpenID.", 

           GetRandomString(5, 7), 

           true, 

           out membershipCreateStatus); 

          if (membershipCreateStatus != MembershipCreateStatus.Success) 
          { 

           TempData["message"] = "Unsuccessful creation of Account. " + membershipCreateStatus.ToString(); 

           return RedirectToAction("Login", "Account"); 

          } 

          if (membershipCreateStatus == MembershipCreateStatus.Success) 
          { 
           user.Comment = alias; 

           Membership.UpdateUser(user); 

           using (MyContext context = new MyContext()) 
           { 
            Data.UserShortId userShortId = new Data.UserShortId { Guid = (Guid)user.ProviderUserKey, DisplayName = alias }; 
            context.UserShortIds.InsertOnSubmit(userShortId); 
            context.SubmitChanges(); 
           } 
          } 
          // Use FormsAuthentication to tell ASP.NET that the user is now logged in, 

          // with the OpenID Claimed Identifier as their username. 

          var cookie = FormsAuthentication.GetAuthCookie(response.ClaimedIdentifier, true); 

          Response.AppendCookie(cookie); 
         } 

         else 
         { 
          var cookie = FormsAuthentication.GetAuthCookie(response.ClaimedIdentifier, true); 

          Response.AppendCookie(cookie); 
         } 

         break; 
        case AuthenticationStatus.Canceled: 

         TempData["message"] = "Login was cancelled at the provider"; 

         return RedirectToAction("Login", "Account"); 

        case AuthenticationStatus.Failed: 

         TempData["message"] = "Login failed using the provided OpenID identifier"; 

         return RedirectToAction("Login", "Account"); 
       } 
      } 

      if (Url.IsLocalUrl(returnUrl)) 
      { 
       return Redirect(returnUrl); 
      } 

      else 
      { 
       return RedirectToAction("Index", "Home"); 
      } 
     } 
    } 

    private static Random random = new Random(46258975); 

    public static int GetRandomInteger(int min, int max) 
    { 
     return random.Next(min, max + 1); 
    } 

    public static string GetRandomString(int minLength, int maxLength) 
    { 
     int strLength = GetRandomInteger(minLength, maxLength); 

     StringBuilder builder = new StringBuilder(); 
     char ch; 
     for (int i = 0; i < strLength; i++) 
     { 
      ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); 
      builder.Append(ch); 
     } 
     return builder.ToString().ToLower(); 
    } 

进行身份验证时:

@using (Html.BeginForm("LoginOpenId", "Account", FormMethod.Post)) 
      { 
       @Html.Hidden("returnUrl", Request.QueryString["ReturnUrl"]) 
       <p>Login using:</p> 
       <input type="submit" class="login-btn facebook" name="provider" value="http://facebook-openid.appspot.com/" /> 
       <input type="submit" class="login-btn google" name="provider" value="https://www.google.com/accounts/o8/id" /> 
       <input type="submit" class="login-btn yahoo" name="provider" value="http://me.yahoo.com/" /> 
      } 

,你可以看到这个还没完成,我使用非官方的FB OpenID提供程序,但你可以使用OAuth单独处理Fb登录。

相关问题