【问题标题】:MVC3 :a required anti-forgery token was not supplied or was invalidMVC3:未提供所需的防伪令牌或无效
【发布时间】:2013-06-26 03:54:10
【问题描述】:

我将页面从 Web 表单页面 (profile.aspx) 重定向到 MVC 视图 (signin.aspx)。在 MVC 控制器中,我有 [ValidateAntiForgeryToken] 来获取令牌信息,但是当我提交 MVC 视图时,我收到 'a required anti-forgery token is not provided or was invalid' 消息。如果我删除 [ValidateAntiForgeryToken],则不会再出现错误消息,但我会丢失我的令牌信息。 我确实需要所有这些令牌信息进行验证。那么我该如何解决这种问题呢? 谢谢。

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    在您看来,在声明 <form> 的地方需要使用 @Html.AntiForgeryToken() 帮助器。

    @using (Html.BeginForm()) {
        Html.AntiForgeryToken()
    
        // The rest of your code
        <div class="something">
            @Html.DisplayFor(m => m.Whatever)
        </div>
    
        // etc...
    }
    

    这会将防伪令牌传递回您的控制器。

    更新:您遇到的问题是您正在执行重定向。当你这样做时,所有的价值都会丢失。不清楚的是您为什么要从一个页面重定向到另一个页面。通常在 MVC 中,如果用户未通过身份验证或会话过期,则会重定向到 login.aspx 页面。如果您的 Signin.aspx 位于 AccountController 中,则 Signing.aspx 和 AccountController 都应标记为防伪。但是,如果用户在 Signin.aspx 中,那么您只需在内部调用 return RedirectToAction("Profile", "WhateverController");,您的信息就会丢失,WhateverController 将失败,因为 Profile 操作不会收到防伪信息。

    您的登录过程应该做一些事情,重定向到 Profile 的 HTTP GET 版本,让用户完成表单输入并将其提交到 Profile 的 HTTP POST 版本。这样您的数据将被保留,并且防伪令牌将成功到达。

    【讨论】:

    • 查看我的更新。另外,您能否扩展您的问题以清楚地解释您的流程?哪个控制器处理 profile.aspx,在重定向时,您到底要重定向到哪里?同一个控制器?不同的控制器?
    • 那么我怎样才能保留所有的令牌信息呢?或者重定向到 MVC 后,如何从 MVC 获取所有令牌信息?谢谢。
    • 在什么情况下执行从 Profile.aspx 到 Signin.aspx 的重定向?
    • 我有一个个人资料网页表单页面,并兑换代码 MVC 视图页面。当用户登录网站时,如果他之前没有注册,它会将他重定向到兑换页面而不是显示他的个人资料。他输入代码后,然后重定向回个人资料页面。我的问题是输入代码后,点击提交,它会抛出这个错误信息。
    • 查看我的更新。它将帮助您弄清楚如何更好地重组您的代码。
    猜你喜欢
    • 2012-01-25
    • 2012-06-09
    • 2013-01-27
    • 1970-01-01
    • 2014-03-07
    • 2013-05-25
    • 2011-02-16
    • 2012-02-19
    相关资源
    最近更新 更多