我正在处理一个asp.net MVC4 Web应用程序,对于登录,我使用的是表单身份验证,该身份验证使用LDAP连接字符串连接到我们的AD,如下所示。 登录获取操作方法:-
[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年了,用户登录从未遇到任何问题。但是今天,一个新用户提到,当他尝试登录系统时,将收到错误“ 处理您的请求时出错。”,并且如果未处理的异常是,则会在我们的系统中引发此错误。被提出。并且我检查了IIS日志,可以看到用户没有访问系统。
所以我能想到的唯一问题是用户密码包含MVC不允许的字符。例如,我尝试输入此密码<script>@1234
和我的用户名,而不是收到此消息“ 提供的用户名或密码不正确。”,我遇到了相同的异常“ < em>处理您的请求时出错。“ ..当然,我不能要求用户提及他的密码,但是我不确定如何允许MVC接受传递给它的任何密码?因为我无法想到任何其他问题...通常在用户登录到应用程序时便会;成功登录或获取“提供的用户名或密码不正确”。 ,但我从未遇到过用户遇到异常的问题……我可以通过传递不安全的字符<script>@1234
答案 0 :(得分:3)
在您的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)