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登錄。

相關問題