【发布时间】:2013-12-11 16:33:19
【问题描述】:
我的 ASP.NET MVC 4.0 应用程序出现异常行为。用户登录期间似乎随机丢失了 POST 请求表单数据。该应用程序使用本地用户数据库的表单身份验证。我有一个简单的登录屏幕,其表单定义如下:
@using (Html.BeginForm("LogOn" ,"Account", FormMethod.Post))
{
<div>
<table class="editor">
<tr>
<td class="editor-label">
@Html.LabelFor(m => m.UserName)
</td>
<td class="editor-field">
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</td>
</tr>
<tr>
<td class="editor-label">
@Html.LabelFor(m => m.Password)
</td>
<td class="editor-field">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</td>
</tr>
<tr>
<td class="editor-label">
@Html.LabelFor(m => m.RememberMe)
</td>
<td class="editor-field">
@Html.CheckBoxFor(m => m.RememberMe)
</td>
</tr>
</table>
</div>
<input type="submit" value="Přihlásit" />
}
控制器动作:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (model == null)
throw new ArgumentNullException("model");
CoreServices.Logger.Info("Loggin attemp for user '{0}'. Request UserName: {1}", model.UserName, HttpContext.Request["UserName"]);
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
CoreServices.Logger.Info("User '{0}' enter valid password.", model.UserName);
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/", StringComparison.Ordinal)
&& !returnUrl.StartsWith("//", StringComparison.Ordinal) && !returnUrl.StartsWith("/\\", StringComparison.Ordinal))
{
CoreServices.Logger.Info("User '{0}' logged in. Redirecting to URL: {1}", model.UserName, returnUrl);
return Redirect(returnUrl);
}
else
{
CoreServices.Logger.Info("User '{0}' logged in. Redirecting to home.", model.UserName);
return RedirectHome();
}
}
else
{
CoreServices.Logger.Info("User '{0}' entered incorrect password. Membership.ValidateUser() returns false.", model.UserName);
ModelState.AddModelError("", "Zadané jméno nebo heslo jsou nesprávné.");
}
}
else
{
CoreServices.Logger.Info("User '{0}' entered invalid password.", model.UserName);
}
// If we got this far, something failed, redisplay form
return View(model);
}
如果用户发布登录表单,则发布的表单值 - 用户名和密码 - 会出现在请求中。我使用 Fiddler 验证了这一点。但是在服务器上,如果我在 Account 控制器中检查 HttpContext.Request["UserName"],则该值为 null,尽管请求中存在 UserName 值。
此行为随机发生,不依赖于浏览器(在 IE9、FF 25、Chrome 24 上报告)。该应用程序托管在 IIS7 上,集成管道模式,SSL 与自签名证书一起使用(但即使不使用 SSL 也会发生)。在开发环境中重现它几乎是不可能的(它在我们的 DEV 服务器上看到了两次这种行为),但在生产环境中很常见(不幸的是,我没有访问权限)。
你知道如何解决这个问题吗?我可以以某种方式监控,缺失值的原因是什么?
谢谢
【问题讨论】:
-
当你在你的 LoGon 方法中放置一个断点时,模型是作为一个参数传入的吗?
-
模型通过(实例不为空,对象存在),但UserName和Password属性为空。
-
你能显示你的控制器操作代码吗?
-
好的,我更新了我原来的帖子。
-
如果您修改操作并删除 ReturnURL 参数(目前在进行故障排除时),它是否适用于该模型?您也可以尝试将表单代码更改为: Html.BeginForm("LogOn", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] })
标签: asp.net asp.net-mvc asp.net-mvc-4 iis postback