我正在使用Visual Studio 2012构建ASP.NET MVC4 Internet网站。
VS2012默认生成了一个模板网站,并实现了SimpleMembership。
SimpleMembership功能非常方便,期待有一件事让我很困惑:
例如,我创建了一个用户帐户,用户名称为“Miles”,然后使用名称“Miles”登录,everthing就可以了。然后我使用名称“miles”(全部小写)注销并登录,登录也是成功的,但是,用户名称为“miles”。更具体地说,User.Identity.Name的值是“miles”,而不是数据库中的“Miles”。
同样,我可以使用“miLes”,“mILes”,“MILES”等登录,用户名也是一样的。常识是,如果身份验证不区分大小写,则用户名应与数据库中的用户名完全相同,在我的情况下为“Miles”,而不是我在登录文本框中键入的用户名。
有谁知道如何解决这个问题?谢谢!
答案 0 :(得分:0)
在你的AccountController中,probablay默认情况下会看到这样的内容:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
调用 WebSecurity.Login()
(传入您在表单中键入的模型上的确切字符串)。
如果您查看WebSecurity.cs的源代码,您会看到FormsAuthentication.SetAuthCookie()
被调用(同样,仍会传递确切的类型字符串)。在此方法实际在响应中设置cookie之前,它会执行GetAuthCookie()
,仍会传入您在登录时键入的确切字符串。
此方法实际上使用您输入的数据再次构建了身份验证HttpCookie
对象。
如果您需要名称与数据库中的名称完全匹配,则需要从数据库中查询记录并将该值传递到WebSecurity.Login()
。