【问题标题】:ASP.NET MVC 3 web site anti-forgery token fails only on IEASP.NET MVC 3 网站防伪令牌仅在 IE 上失败
【发布时间】:2012-01-26 02:55:21
【问题描述】:

在我的 MVC 3 项目中,我有一个使用 MVC 3 中内置的防伪逻辑的登录页面。

在 Firefox 和 Opera 上它工作得很好,但在 IE 上我得到了这个:

A required anti-forgery token was not supplied or was invalid.

我真的很困惑为什么只有 IE 会遇到这种情况,我检查了 cookie 设置,它们的设置与其他浏览器相同,所以我在这里迷路了。

当我使用防伪代码时,我会同时使用 SALT 和域检查(这无关紧要,但值得一提)。

查看代码如下:

@model login.Models.LogOnModel

@{
    ViewBag.Title = "Log On";
}

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<script type="text/javascript">
$(function () {
    //focus on form.
    $("#UserName").focus();
});
</script>

 @using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { @class = "form login" })) {
@Html.AntiForgeryToken("!@#Hq4(", ViewBag.AppDomain, "/")
<div id="box">
<h1>Login</h1>
Please enter your username and password. @Html.ActionLink("Register", "Register") if you don't have an account.
<div class="block" id="block-login">
    <h2>
        Login Form</h2>
    <div class="content login">
              @Html.ValidationSummary(true)
        <div class="group buffer">
            <div class="left">
                <label class="label right">
                    @Html.LabelFor(m => m.UserName)</label>
            </div>
            <div class="right">
                @Html.TextBoxFor(m => m.UserName, new { @class = "text_field" })
                @Html.ValidationMessageFor(m => m.UserName)
            </div>
        </div>
        <div class="group buffer">
            <div class="left">
                <label class="label right">
                    @Html.LabelFor(m => m.Password)</label>
            </div>
            <div class="right">
                @Html.PasswordFor(m => m.Password, new { @class = "text_field" })
                @Html.ValidationMessageFor(m => m.Password)
            </div>
        </div>
        <div class="group buffer">
            <div class="left">
                <label class="label right">
                    @Html.LabelFor(m => m.RememberMe)</label>
            </div>
            <div class="right">
                @Html.CheckBoxFor(m => m.RememberMe)
            </div>
        </div>
        <div class="group navform buffer">
            <div class="right">
                <button class="button" type="submit">
                    <img src="@Url.Content("~/Content/images/icons/key.png")" alt="Save" />
                    Login
                </button>
            </div>
        </div>
    </div>
</div>
</div>
}

ViewBag.AppDomain 是 web.config 中的一个值,用于在测试和生产使用期间轻松设置。

如果我从防伪标签中删除域和路径部分,它就可以正常工作。所以这两者之一一定是问题所在。

【问题讨论】:

  • 你好,你用的是什么版本的IE?
  • 您是否能够(使用 IE 的开发工具、Firebug Lite 或 Fiddler)查明您的 POST 请求是否将 AntiForgery cookie 发回?
  • 我没有使用任何开发工具,不过我有一些用于 Opera 和 firefox。我正在使用 IE 9。
  • 您在 IE 中启用了 cookie 吗?
  • @php-jquery-programmer 您可以通过按键盘上的F12 打开 IE9 的内置开发工具。或者使用Firebug Lite

标签: c# asp.net-mvc-3 antiforgerytoken


【解决方案1】:

我在使用自定义 AntiCSRF 令牌创建器时遇到了类似的问题。我没有使用 MVC3,但它可能是一个类似的问题。

对我来说,问题是我在本地用于测试网站的域名中有一个下划线。理论上,DNS 名称不能有下划线(即使“计算机名”可以),所以 IE 没有保存 cookie。

这可能不是同一个问题,但可能与测试环境和 IE 处理 cookie 的方式有关。

这是一篇关于 IE cookie 处理内部机制的非常有趣的文章,它可能会帮助您发现问题。

http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx

【讨论】:

  • 我的域在测试期间只是本地主机。
  • @php-jquery-programmer 哦,值得一试。您可能会发现该链接很有帮助,它还有许多其他有用的提示。
【解决方案2】:

我在一个用 VS2010 构建并通过 IE 11 查看的 MVC3 项目中遇到了与此相同的问题(它在 Firefox 中运行良好)。

我设法绕过它的方法是将 cookieless="UseCookies" 添加到根目录中 web.config 文件的“forms”元素中:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogIn" timeout="2880" slidingExpiration="true" requireSSL="false" cookieless="UseCookies"/>
</authentication>

【讨论】:

  • 我在 VS2012 中使用 MVC4 并在 IE10 中查看。这似乎对我不起作用。你知道为什么这行不通吗?这是一个真正的脑筋急转弯。
  • 我还没有对 MVC4 和 VS2012 做过任何工作,所以我不知道它是否以不同的方式处理这个问题。您可以尝试的其他方法是确保用户允许您的网站接受 cookie,以便防伪令牌起作用。
【解决方案3】:

不是我最喜欢的想法,但在我弄清楚这一点之前,我取出了让 IE 开心的域和路径参数。

如果有人有建议,我很乐意,但现在我会解决只是给令牌加盐。

感谢大家的帮助。

【讨论】:

  • 您能解释一下取出域和路径参数是什么意思吗?什么?我遇到了这个问题,目前无法解决。
  • 在控制器上,您可以通过属性设置域,我从那里删除了它。我会发布代码,但这个应用程序被退回了,我已经离开了。
猜你喜欢
  • 2014-01-23
  • 1970-01-01
  • 2014-04-26
  • 2015-01-11
  • 2019-06-09
  • 2015-03-12
  • 2014-10-03
  • 1970-01-01
  • 2022-08-16
相关资源
最近更新 更多