【发布时间】: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