我们收到“未提供所需的防伪令牌或该令牌无效”的信息。错误,并且经过一些进一步的调查,我成功地以最简单的形式重新创建了问题 - 我要么做了完全错误的事情,要么这是防伪令牌系统的限制。
不管怎样,我会很感激一些建议!
空 MVC 2 项目:
一个视图页面,一个控制器
view:
<%--Sign in form:--%>
<% using(Html.BeginForm("SignIn", "Home", FormMethod.Post)) {%>
<%= Html.AntiForgeryToken()%>
<input type="submit" value="Sign in" />
<%}%>
控制器:
public ActionResult Index()
{
ViewData["status"] = "Index";
return View();
}
[ValidateAntiForgeryToken]
public ActionResult SignIn()
{
ViewData["status"] = "Signed In!";
FormsAuthentication.SetAuthCookie("username", false);
return View("Index");
}
[编辑:简化的代码示例]
为了重新创建异常,请打开两个未登录的选项卡 - 在第一个选项卡上登录,然后在第二个选项卡上登录。
当我猜测正确的行为是重定向到登录页面(共享原始登录选项卡的会话/身份验证)时,第二个选项卡将始终引发防伪造异常
任何意见,将不胜感激!
干杯,
戴夫
查看 MVC 2 源代码,如果您已登录,AntiForgeryToken 隐藏字段似乎包含序列化的 User.Identity.Name。在第 69 行ValidateAntiForgeryTokenAttribute
然后似乎会使用当前的 User.Identity.Name 检查您的令牌。
string currentUsername = AntiForgeryData.GetUsername(filterContext.HttpContext.User);
if (!String.Equals(formToken.Username, currentUsername, StringComparison.OrdinalIgnoreCase)) {
// error: form token is not valid for this user
// (don't care about cookie token)
throw CreateValidationException();
}
因为在您的其他选项卡中,您现在已登录,上面的代码会使不包含 User.Identity.Name 的现有令牌失效。
这可以通过添加一个来解决!string.IsNullOrEmpty(formToken.Username)
围绕该检查,但我不知道这是否会引发安全问题,而且这意味着需要自定义 MVC 2 构建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)