如何使用用户名或电子邮件使WebSecurity.Login登录?

时间:2012-09-13 10:41:45

标签: asp.net-mvc-4 .net-4.5 simplemembership

simplemembership中的

WebSecurity.Login使用用户名和密码,如何使用用户名或电子邮件而不是用户名?来登录用户,以便用户可以自由输入他的电子邮件或用户名进行登录。

4 个答案:

答案 0 :(得分:27)

您可以从SimpleMembershipProvider继承,只需覆盖此类ValidateUser方法。

public class ExtendedSimpleMembershipProvider : SimpleMembershipProvider
{
    public override bool ValidateUser(string login, string password)
    {
        // check to see if the login passed is an email address
        if (IsValidEmail(login))
        {
            string actualUsername = base.GetUserNameByEmail(login);
            return base.ValidateUser(actualUsername, password);
        }
        else
        {
            return base.ValidateUser(login, password);
        }

    }

    bool IsValidEmail(string strIn)
    {
        // Return true if strIn is in valid e-mail format.
        return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
    }

}

这只是一种方法。您可以编写自己的MembershipProvider,但如果您只需要更改ValidateUser方法,则应该可以使用。

将以下配置添加到web.config以设置提供程序。

  <membership defaultProvider="ExtendedSimpleMembershipProvider">   
    <providers>
    <clear/>
    <add name="ExtendedSimpleMembershipProvider"
         type="MyProject.Web.SimpleMembershipProvider, MyProject.Web"/>
    </providers>
  </membership>

这应该让你朝着正确的方向前进。

答案 1 :(得分:18)

WebSecurity只需调用FormsAuthentication。 你可以这样做:

if (WebSecurity.UserExists(username)) 
{
     FormsAuthentication.SetAuthCookie(username, false);
}

很好奇为什么你需要这个功能。 (仅供参考:我的理由是,如果用户在快速结账(购物车)流程中使用PayPal进行了身份验证,我允许他们以相同的用户身份自动登录到我的网站,因为我认为风险非常低不是合适的人)。

可能有用:Difference between FormsAuthentication and WebSecurity

答案 2 :(得分:2)

您可以使用来自UserProfiles表的给定电子邮件拉取用户

 [HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
  var login = false;
  if (ModelState.IsValid)
  {
    if (!model.UserName.Contains("@"))
    {
      if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        login = true;
    }
    else
    {
      var targetUser = db.UserProfiles.Where(u => u.Email == model.UserName).FirstOrDefault();
      if (targetUser != null && WebSecurity.Login(targetUser.UserName, model.Password, persistCookie: model.RememberMe))
        login = true;
    }

  }
  if (login)
    return Redirect(returnUrl);
  // If we got this far, something failed, redisplay form
  ModelState.AddModelError("", "The user name or password provided is incorrect.");
  return View(model);
}

答案 3 :(得分:0)

请勿使用电子邮件进行用户识别。这是一个非常容易猜测的事情,今天人们可以使用工具来猜测它们。这就是使用用户名的原因,它可以是任何东西。

话虽如此,如果您真的想要 - 您可以使用用户名/电子邮件+密码所在的表的ID,并首先将其与用户名匹配,如果失败则与电子邮件匹配。如果两者都失败,则登录失败。

您在检查代码中使用以下内容时应该没有任何问题,因为您没有在此发布任何内容我无法修改以查看您的需求。

WebSecurity.GetUserId(email);

关于MVC的下一个问题,你应该首先检查ASP论坛,然后在这里试试。只是一个意见

相关问题