包含 ViewModel 和两个表单的页面上显示“防伪 cookie 令牌和表单字段令牌不匹配”

问题描述 投票:0回答:1

在 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
属性。提交表单后,分别从
Login
获取
Register
LoginOrRegisterViewModel

当页面加载并且注册用户在一段时间(几个小时?)后尝试登录时,“登录并注册”页面最初显示,但是当提交

Login
表单时,会显示上述错误,直到刷新根页面.

我已在 Web.config 中添加了机器密钥,并在两种表单中添加了

Html.AntiForgeryToken()
。我怀疑这个错误可能与两种表单和视图模型有关。

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

c# asp.net-mvc-4 mono antiforgerytoken
1个回答
0
投票

MVC 最佳编码标准,始终以代码关注点分离的方式进行实践。

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

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

Html 助手将在您的表单中生成唯一的标记,例如,

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

对于每个表单,都会生成唯一的防伪令牌,它将解决您的冲突。

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

© www.soinside.com 2019 - 2024. All rights reserved.