Asp.net mvc 4 如何使网站安全。使用用户名或电子邮件登录?

Asp.net mvc 4 如何使网站安全。使用用户名或电子邮件登录?,asp.net-mvc-4,.net-4.5,simplemembership,Asp.net Mvc 4,.net 4.5,Simplemembership,WebSecurity.Login在simplemembership中使用用户名和密码,如何让用户使用用户名或电子邮件而不仅仅是用户名登录?,使用户可以自由输入其电子邮件或用户名进行登录。您可以从SimpleMembershipProvider继承,然后像这样覆盖ValidateUser方法 public class ExtendedSimpleMembershipProvider : SimpleMembershipProvider { public override bool Val

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

您可以从
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>


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

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

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

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

WebSecurity.GetUserId(email);

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

网络安全只是在幕后调用
表单验证
。 您可以这样做:

if (WebSecurity.UserExists(username)) 
{
     FormsAuthentication.SetAuthCookie(username, false);
}
好奇你为什么需要这个功能。(FIY:我需要这个的理由是如果用户贝宝在一个快速结账(购物车)流中进行了身份验证,我允许他们自动登录到我的站点,因为我认为这个风险很低,因为它不是合适的人)。p>
可能有用:

您只需从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);
}

我误解了这个问题,认为你的意思是没有密码,所以这就是答案:)我同意这很容易猜测,但你的普通用户会使用它或其他容易猜测的东西。假设你有大卫·琼斯。他可能会用大卫·琼斯、琼斯、杰森。但它们都是可笑的猜测,所以我不认为这会有太大的区别。