WebSecurity.Login
在 simplemembership 中获取用户名和密码,如何使其使用用户名或电子邮件而不是用户名登录用户?,使用户可以自由输入他的电子邮件或用户名登录。
4 回答
您可以继承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>
这应该让你朝着正确的方向前进。
WebSecurity 只是FormsAuthentication
在后台调用。你可以这样做:
if (WebSecurity.UserExists(username))
{
FormsAuthentication.SetAuthCookie(username, false);
}
好奇你为什么需要这个功能。(仅供参考:我需要这样做的原因是,如果用户在 Express Checkout(购物车)流程中通过 PayPal 进行了身份验证,我允许他们以同一用户身份自动登录到我的网站,因为我认为这样做的风险非常低不是对的人)。
您可以从 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);
}
不要使用电子邮件进行用户识别。这是一件很容易猜测的事情,今天人们可以使用一种工具来为他们猜测。这就是为什么使用用户名,它可以是任何东西。
话虽如此,如果您真的想要 - 您可以使用用户名/电子邮件 + 密码所在的表的 ID,并将其首先与用户名匹配,如果失败则将其与电子邮件匹配。如果两者都失败,则登录失败。
将下面的代码用于您的检查代码应该没有问题,因为您没有在此处发布任何内容,我无法修改以查看您需要的内容。
WebSecurity.GetUserId(email);
对于您关于 MVC 的下一个问题,您应该首先查看 ASP 论坛,然后在这里尝试。只是一个意见