ASP.NET MVC 3网站防伪令牌仅在IE上失败
本文关键字:IE 失败 令牌 MVC NET 网站 ASP | 更新日期: 2023-09-27 18:18:31
在我的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的值。配置以便在测试和生产使用期间轻松设置。
如果我从防伪标签中删除域名和路径部分,它就能正常工作。所以一定是这两个中的一个出了问题
我在使用自定义的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我在VS2010中构建的MVC3项目中遇到了同样的问题,并通过IE 11查看(它在Firefox中工作良好)。
我设法绕过它的方法是在web中的"forms"元素中添加cookieless="UseCookies"。根目录下的配置文件:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogIn" timeout="2880" slidingExpiration="true" requireSSL="false" cookieless="UseCookies"/>
</authentication>
这不是我最喜欢的主意,但在我弄清楚之前,我去掉了域名和路径参数,这让IE很高兴。
如果有人有建议,我很乐意,但现在我只想把token放盐。
谢谢大家的帮助。