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