20

WebSecurity.Login在 simplemembership 中获取用户名和密码,如何使其使用用户名或电子邮件而不是用户名登录用户?,使用户可以自由输入他的电子邮件或用户名登录。

4

4 回答 4

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>

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

于 2012-09-20T19:05:43.633 回答
18

WebSecurity 只是FormsAuthentication在后台调用。你可以这样做:

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

好奇你为什么需要这个功能。(仅供参考:我需要这样做的原因是,如果用户在 Express Checkout(购物车)流程中通过 PayPal 进行了身份验证,我允许他们以同一用户身份自动登录到我的网站,因为我认为这样做的风险非常低不是对的人)。

可能有用:FormsAuthentication 和 WebSecurity 之间的区别

于 2013-02-21T11:13:40.530 回答
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);
}
于 2013-10-07T08:07:20.117 回答
0

不要使用电子邮件进行用户识别。这是一件很容易猜测的事情,今天人们可以使用一种工具来为他们猜测。这就是为什么使用用户名,它可以是任何东西。

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

将下面的代码用于您的检查代码应该没有问题,因为您没有在此处发布任何内容,我无法修改以查看您需要的内容。

WebSecurity.GetUserId(email);

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

于 2012-09-23T13:04:34.387 回答