在 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()
。我怀疑这个错误可能与两种表单和视图模型有关。
有谁知道如何修复该错误?谢谢。
MVC 最佳编码标准,始终以代码关注点分离的方式进行实践。
如果您将 @Html.AntiForgeryToken() 放在 html 表单上,那么您需要通过编写属性 [ValidateAntiForgeryToken()] 来验证控制器端方法上的防伪功能。
Html 助手将在您的表单中生成唯一的标记,例如,
<input name="__RequestVerificationToken" type="hidden" value="4dvPVQIvpXNEKZyV1DCjeN1rmtMDJ9fQ2">
对于每个表单,都会生成唯一的防伪令牌,它将解决您的冲突。
如果您仍然面临困难,请告诉我。