页面上的防伪Cookie令牌和表单字段令牌不匹配(ViewModel和两个表单)。

3
在运行于Mono上的MVC4应用程序中,我遇到了以下错误:

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

该错误出现在“登录和注册”页面上。该页面具有以下LoginOrRegisterViewModel:
public class LoginOrRegisterViewModel
{
    public LoginModel Login { get; set; }
    public RegisterModel Register { get; set; }
}

这个文本是在GET请求时传递给页面的。

页面上有两个Html.BeginForms(),一个是登录表单,另一个是注册表单。第一个调用控制器上的Login操作,第二个调用Register操作。这两个操作都有一个ValidateAntiForgeryToken属性。当提交表单时,分别从LoginOrRegisterViewModel中获取LoginRegister

当页面加载时,如果已注册用户在几小时后尝试登录,则最初会显示“登录和注册”页面,但是当提交Login表单时,上述错误会显示,直到根页面刷新。

我已将Machine Key添加到Web.config,并在两个表单中添加了Html.AntiForgeryToken()。我怀疑这个错误可能与两个表单和视图模型有关。

有人知道如何修复此错误吗?谢谢。


你是否同时在使用 Code First 重新生成数据库,但忘记将其关闭了?这是一个典型的情况,用户会被重新创建在数据库中,导致防伪令牌发生变化。 - Wim Ombelets
@WimOmbelets 不,数据库不会重新生成。只有在注册用户时才会创建用户(显然)。 - user2609980
@dna 这有关紧要吗?这些类型的应用程序错误对用户体验不利。目前我只是移除了防伪令牌。 - user2609980
如果会话过期(其中包含防伪令牌),那么当用户在此之后提交表单时,令牌的验证显然会失败。我不是说这是您错误的原因,但这可能值得研究一下。 - dna
看一下这个链接: https://dev59.com/K2Ml5IYBdhLWcg3wz5yS#30972311 - Yovav
显示剩余2条评论
1个回答

0

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

  • 创建两个不同的模型,一个用于LoginViewModel,另一个用于Register ViewModel。
  • 为登录和注册分别创建部分视图,并通过Partial或RenderAction关键字访问。

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

HTML助手将在您的表单内生成唯一令牌,例如:

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

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

如果您仍然遇到困难,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接