如何使WebSecurity.Login使用的用户名或邮箱登录?(How to make WebSe

2019-06-28 07:41发布

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

Answer 1:

你可以从你的继承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>

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



Answer 2:

WebSecurity只是调用FormsAuthentication引擎盖下。 你可以这样做:

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

好奇,为什么你需要这个功能。 (FYI:我对需要这种推理是,如果一个用户在一个快速结账(购物车与贝宝认证),流我让他们可以自动登录到我的网站为同一个用户,因为我认为风险非常低,它会不是正确的人)。

可使用的: FormsAuthentication和区别WebSecurity



Answer 3:

您只需拉动用户从表中的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);
}


Answer 4:

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

有了这样说,如果你真的想 - 你可以使用其中的用户名/电子邮件+密码所在的表的ID,并首先匹配到一个用户名,如果失败匹配到的电子邮件。 如果都失败,登录失败。

你应该没有问题使用这个下面您的校验码,因为你没有张贴任何这里我不能修改,看你需要什么。

WebSecurity.GetUserId(email);

您就MVC接下来的问题,你应该先检查ASP论坛,然后尝试在这里。 只是一个意见



文章来源: How to make WebSecurity.Login to login using username or email?