0

我喜欢使用 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 按钮或输入他们的电子邮件和密码登录。
问题
- 我有时会收到null来自 fb 的用户电子邮件;如果电子邮件可以为空,则我不能使用它来成为会员用户。
- 这是同时使用 memership 和 fb 的好方法吗?

4

2 回答 2

1

3) 发送用户临时密码到邮箱

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

我不会给他们发密码。为什么,那只是通过不安全的电子邮件媒介发送的另一条明智信息。

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

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

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

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

但在这种情况下,您仍然拥有他们的用户名,因此您可以用用户名@facebook.com 替换丢失的电子邮件地址——Facebook 最近进行了设置,现在每个用户都有这个电子邮件地址。

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

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

于 2012-07-06T07:38:32.083 回答
0

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

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

  3. C# 的使用和OpenID

  4. 将以下代码片段(这还没有完成,但它可以工作)添加到 Account Controller:

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

于 2012-07-06T08:01:43.843 回答