这是混合FB Connect和ASP成员资格的好方法吗?

时间:2012-07-05 22:55:14

标签: asp.net-mvc facebook asp.net-membership membership-provider

我喜欢使用asp会员资格,我需要在网站上进行FB集成,所以我不想混合它们。这是我打算做的事情:

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的好方法吗?

2 个答案:

答案 0 :(得分:1)

  

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

     

我计划使用来自fb的电子邮件作为用户名,以便用户可以使用fb按钮登录或输入他们的电子邮件和密码。

我不会给他们发密码。为什么,这只是通过不安全的电子邮件发送的另一条敏感信息。

相反,如果他们使用Facebook登录我们的网站,我会给他们设置密码的工具。如果他们选择这样做,他们也可以使用他们的用户名和密码登录 - 如果没有,他们仍然可以通过Facebook登录。

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

  

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

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

但在这种情况下,您仍然拥有自己的用户名,因此您可以将用户名 @ facebook.com替换为丢失的电子邮件地址 - Facebook最近将其设置为每个用户现在拥有此电子邮件地址。

  

这是使用memership和fb的好方法吗?

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

答案 1 :(得分:0)

我是这样做的(也许不是最好的方法,但它有效):

  1. 我创建标准的会员表
  2. 2.添加另一个表格,我将用户链接到普通ID而不是Guids,所以当有人想要查看用户个人资料时,我不必在网址中添加guid,我也有字段DisplayName,因此多个用户可以具有相同的DisplayName

  3. 使用和OpenID库进行C#

  4. 将以下代码段(尚未完成,但有效)添加到帐户控制器:

  5.    [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登录。