asp.net - MVC ValidateAntiForgeryToken 多标签问题

标签 asp.net asp.net-mvc asp.net-mvc-2 antiforgerytoken

我们一直收到“未提供或无效所需的防伪 token ”。错误,在进一步的调查中,我设法以最简单的形式重现了这个问题——我要么做错了什么,要么这是防伪 token 系统的限制。

无论哪种方式,我都会很感激一些建议!

空的 MVC 2 项目:
一个 View 页面,一个 Controller

看法:

<%--Sign in form:--%>
<% using(Html.BeginForm("SignIn", "Home", FormMethod.Post)) {%>
    <%= Html.AntiForgeryToken()%>
    <input type="submit" value="Sign in" />
<%}%>

Controller :
public ActionResult Index()
{
    ViewData["status"] = "Index";
    return View();
}

[ValidateAntiForgeryToken]
public ActionResult SignIn()
{
    ViewData["status"] = "Signed In!";
    FormsAuthentication.SetAuthCookie("username", false);
    return View("Index");
}

[编辑:简化的代码示例]

为了重新创建异常(exception),打开两个未登录的选项卡 - 在第一个选项卡上登录,然后在第二个选项卡上登录。

第二个选项卡将始终引发防伪异常,当我猜正确的行为是重定向到登录页面(共享原始登录选项卡的 session /身份验证)

任何意见,将不胜感激!

干杯,
戴夫

最佳答案

查看 MVC 2 源代码,如果您已登录,则 AntiForgeryToken 隐藏字段似乎包含序列化的 User.Identity.Name。在 ValidateAntiForgeryTokenAttribute 的第 69 行它似乎然后使用当前的 User.Identity.Name 检查您的 token 。

    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 的现有 token 无效。

这可以通过添加 !string.IsNullOrEmpty(formToken.Username) 来解决。围绕该检查,但我不知道这是否会引发安全问题,而且这意味着拥有自定义 MVC 2 Build。

关于asp.net - MVC ValidateAntiForgeryToken 多标签问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4031617/

相关文章:

ASP.NET MVC 用户控件需要 css/javascript

asp.net - web.config 文件设置是否会覆盖 IIS 设置?

c# - Linq to Sql : Change Database for each connection

asp.net-mvc-2 - 是否可以在 ASP.Net MVC 应用程序的 Controller 级别关闭 ssl?

c# - C# 属性的正确语法

asp.net - 如何在客户端防止 PostBack?

jquery - 是否应该使用网络服务来创建整个网站?

c# - MVC 中 ASPXAUTH Cookie 的安全标志

asp.net - 如何使用 Ninject 注入(inject)一个 asp.net (mvc2) 自定义成员提供程序?

asp.net - 奇怪的 ASP.NET MVC 链接 (A(anythingworkshere))