ASP.NET MVC4 SimpleMembership中用户帐户的显示名称不一致

时间:2014-07-03 03:50:13

标签: c# asp.net-mvc visual-studio-2012 simplemembership

我正在使用Visual Studio 2012构建ASP.NET MVC4 Internet网站。

VS2012默认生成了一个模板网站,并实现了SimpleMembership。

SimpleMembership功能非常方便,期待有一件事让我很困惑:

例如,我创建了一个用户帐户,用户名称为“Miles”,然后使用名称“Miles”登录,everthing就可以了。然后我使用名称“miles”(全部小写)注销并登录,登录也是成功的,但是,用户名称为“miles”。更具体地说,User.Identity.Name的值是“miles”,而不是数据库中的“Miles”。

同样,我可以使用“miLes”,“mILes”,“MILES”等登录,用户名也是一样的。常识是,如果身份验证不区分大小写,则用户名应与数据库中的用户名完全相同,在我的情况下为“Miles”,而不是我在登录文本框中键入的用户名。

有谁知道如何解决这个问题?谢谢!

1 个答案:

答案 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()