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