【问题标题】:ASP MVC + IIS7, POST form data missing on server sideASP MVC + IIS7,服务器端缺少 POST 表单数据
【发布时间】: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


【解决方案1】:

原因可能是 IE 在 POST 上的 HTTP 标头中的“内容长度”参数中发送“0”,尽管请求的正文具有非零内容(包含表单数据)。具有现有表单数据但内容长度为“0”的请求在 IIS 上未正确处理,并且值在 HttpContext.Request 中不可用。根据文章Challenge-Response Authentication and Zero-Length Posts,如果浏览器向网站的安全部分发出请求,要求用户使用凭据进行授权,就会发生这种情况。在该请求之后,IE 期望下一个 POST 请求是对该凭据请求的无主体响应。有关详细信息,请参阅链接文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2014-04-01
    • 2018-12-26
    相关资源
    最近更新 更多