我工作的一个asp.net MVC4 Web应用程序,并为登录我使用的是使用LDAP连接字符串连接到我们的广告,如下形式的认证。登录获取动作方法: -
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
returnUrl = TempData["returnUrl"] != null ? TempData["returnUrl"].ToString() : String.Empty;
List<String> domains = new List<String>();
domains.Add("*****");
ViewBag.ReturnUrl = returnUrl;
ViewBag.Domains = domains;
return View();
}
登录后的操作方法: -
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
MembershipProvider domainProvider;
domainProvider = Membership.Providers["TestDomain1ADMembershipProvider"];
if (ModelState.IsValid)
{
// Validate the user with the membership system.
if (domainProvider.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
List<String> domains2 = new List<String>();
domains2.Add("****");
ViewBag.Domains = domains2;
return View(model);
}
return RedirectToLocal(returnUrl);
}
List<String> domains = new List<String>();
domains.Add("****");
ViewBag.Domains = domains;
return View(model);
}
现在,我一直在使用这个系统5年,从来没有面对用户登录任何问题。但今天一个新的用户提到,当他试图登录到系统,他将得到一个错误“错误处理您的请求。”,而这个错误会在我们的系统中,如果未处理的异常被提高3。和我检查IIS日志,我可以看到的是,用户没有访问系统。
所以我能想到的唯一的问题是,用户的密码含有MVC不允许的字符。例如,我试图用我的用户名的输入此密码<script>@1234
,和而不是得到这个消息“提供的用户名或密码不正确。” ,我得到了同样的异常“错误处理您的请求。”当然我不能要求用户提他的密码,但我不知道我怎么可以让MVC接受传递给它的任何密码?因为我想不出其他任何问题......因为通常当用户登录到应用程序,他们要么;成功登录或获得“提供的用户名或密码不正确。” ,但我从来没有遇到一个问题,用户会得到一个异常...我能够通过传递不安全的字符复制<script>@1234
在您的LoginModel
使AllowHtmlAttribute
添加到Password
领域。这将绕过对像<script>
输入检查。
[AllowHtml]
public string Password { get; set; }
使用它不遗余力,当然。 MVC正试图保护你免受脚本注入攻击,因此你只应禁用此检查在少数情况下,你可以肯定值安全处理。 (在这种情况下,密码不应该被显示给用户,所以即使在HTML,它不能注入HTML到页)。
另外,如果你不能改变LoginModel
类,你可以尝试添加ValidateInputAttribute
您Login
POST方法。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Login(LoginModel model, string returnUrl)