"防伪cookie令牌和表单字段令牌不匹配"在页面上使用ViewModel和两个表单

时间:2015-04-12 16:48:18

标签: c# asp.net-mvc-4 mono antiforgerytoken

在Mono上运行的MVC4应用程序中出现错误:

  

防伪cookie令牌和表单字段令牌不匹配

登录和注册"页。此页面的LoginOrRegisterViewModel如下所示:

public class LoginOrRegisterViewModel
{
    public LoginModel Login { get; set; }
    public RegisterModel Register { get; set; }
}

将哪些内容传递给GET请求中的页面。

页面上有两个Html.BeginForms(),一个Login - 表单和一个Register表单。第一个调用控制器上的Login操作,第二个调用Register操作。这两个操作都具有ValidateAntiForgeryToken属性。提交表单时,LoginRegister分别从LoginOrRegisterViewModel获得。

当页面加载并且注册用户尝试登录一段时间后(几个小时?)"登录和注册"页面最初显示,但是当提交Login表单时,上面的错误会显示,直到刷新根页。

我在Web.config中添加了一个机器密钥,并在两个表单中添加了Html.AntiForgeryToken()。我怀疑这个错误可能与两个表单和视图模型有关。

有谁知道如何修复错误?感谢。

1 个答案:

答案 0 :(得分:0)

MVC最佳编码标准,始终以分离代码关注实践。

  • 为LoginViewModel创建两个不同的模型1,为Register View模型创建2个。
  • 通过Partial或RenderAction关键字为登录和注册及访问创建单独的部分视图。

如果您在html表单上放置 @ Html.AntiForgeryToken(),那么您需要通过编写属性 [ValidateAntiForgeryToken()]来验证控制器端方法上的防伪。

Html帮助器将在您的表单中生成唯一的令牌,如

<input name="__RequestVerificationToken" type="hidden" value="4dvPVQIvpXNEKZyV1DCjeN1rmtMDJ9fQ2">

对于每个表单,将生成唯一的防伪标记,它将解决您的冲突。

如果您仍面临困难,请告诉我。