获取Facebook电子邮件并使用Oauth Login保存到会员数据库

时间:2015-03-05 13:47:42

标签: c# asp.net facebook oauth webforms

我最近在我的网站上实施了facebook Oauth。我正在使用webforms和会员数据库,所以当有人第一次使用facebook登录时,会要求他们选择用户名。现在这个工作正常,直到我将"requiresUniqueEmail=false"更改为"true"(检查编辑以获取更新)

由于某些原因,我的 Web.configs成员资格提供程序中的此更改会弄乱整个Facebook登录信息。

当我进行此更改并尝试为新用户设置用户名(从而创建它)时,它会显示"无效的电子邮件"。这对我来说毫无意义,我唯一改变的是我需要一个独特的电子邮件。现在我无法使用Facebook注册。

我需要此设置,因为我允许在没有社交媒体的情况下注册,当他们以这种方式注册时,我不希望他们重新使用电子邮件。我该怎么办?

编辑:我检查了我的会员资料数据库,结果发现在"会员资格"表在facebook上注册的用户的电子邮件值为NULL。也就是说,他们的电子邮件不会保存到表中。这必须是它不能独特的原因。我该如何解决这个问题?

我想我必须在这里添加它(我使用在webforms中生成的RegisterExternalLogin.aspx):

protected string ProviderName
        {
            get { return (string)ViewState["ProviderName"] ?? String.Empty; }
            private set { ViewState["ProviderName"] = value; }
        }

    protected string ProviderDisplayName
    {
        get { return (string)ViewState["ProviderDisplayName"] ?? String.Empty; }
        private set { ViewState["ProviderDisplayName"] = value; }
    }

    protected string ProviderUserId
    {
        get { return (string)ViewState["ProviderUserId"] ?? String.Empty; }
        private set { ViewState["ProviderUserId"] = value; }
    }

    protected string ProviderUserName
    {
        get { return (string)ViewState["ProviderUserName"] ?? String.Empty; }
        private set { ViewState["ProviderUserName"] = value; }
    }

然而表" UserOpenOauthData"在数据库(标准生成的oauth数据库)中甚至没有电子邮件列,只有" Membership"表格,所以我不知道如何添加电子邮件。我真的需要这个,我一直在寻找几天没有找到如何做的例子,只有MVC例子可用或数据库有一个名为&#34的表格的示例; OauthMembership"有一个电子邮件列,我的没有。

如果有人可以帮我从facebook收到电子邮件并将其保存到我的数据库中,我会非常高兴。真的不想关闭非外部登录。

想尝试?只需转到Visual studio(我使用VS12),使用asp.net 4.5创建一个Webforms项目,然后让它为您创建模板。在Account-folder中,您可以找到用于处理成员的所有方法。在启动时设置你的facebook AppID等,然后通过使用facebook注册你的第一个用户来创建数据库。如您所见,它不会保存电子邮件。如果您尝试将电子邮件设置为" Unique"在会员提供商中,您无法使用Facebook创建用户。

1 个答案:

答案 0 :(得分:2)

您可以做的是创建自己的方法来检查电子邮件,然后在创建用户之前调用它。如果您使用的是CreateUserWizard,则可以使用名为OnCreatingUser的方法。

CreateUserWizard背后的代码:

protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e)
{
    TextBox EmailTextBox = RegisterUser.CreateUserStep.ContentTemplateContainer.FindControl("Email") as TextBox;
    String emailParam = EmailTextBox.Text;

    using (SqlConnection con = new SqlConnection(strCon))
    {
        con.Open();
        using (SqlCommand cmd = con.CreateCommand())
        {
           cmd.CommandText = "SELECT Email FROM Memberships WHERE Email=@emailParam";
           cmd.Parameters.AddWithValue("@emailParam", emailParam);

           using (SqlDataReader reader = cmd.ExecuteReader())
           {
              if (reader.Read())
              {
                  LabelExists.Text = "This e-mail is already registered";
                  e.Cancel = true; //Cancels registration
              }
            else
            {
                //create the user
            }

         }
      }
     con.Close();
   }
}