我在mvc4中创建了一个登录表单和一些其他控制器。我在控制器上放置[ValidateAntiForgeryToken],在每个视图中放置@ Html.AntiForgeryToken()。但在登录后,当页面被重定向到其他页面时,它会给出错误 -
所需的防伪表格字段“__RequestVerificationToken”不存在。“
我的样本控制器是 -
[HttpPost, ActionName("UserLogin")]
[ValidateAntiForgeryToken]
[AllowAnonymous]
public ActionResult UserLogin(FormCollection collection)
{
string username = collection["txtUser"].ToString();
string password = collection["pwd"].ToString();
string Browser = HttpContext.Request.Browser.Browser;
if (db.Users.Any(u => u.Email == username && u.Password == password))
{
User usr = db.Users.Single(u => u.Email == username && u.Password == password);
return RedirectToAction("Details","User",usr.Id);
}
return HttpNotFound();
}
并且查看是 -
@using(Html.BeginForm("UserLogin","User")){
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
/// .......表单元素.... // }
答案 0 :(得分:1)
RedirectToAction 使浏览器根据MSDN向指定的操作发出GET请求。您的AntiForgeryToken仅在您发布表单时可用。因此,您重定向到的操作不能指望AntiForgeryToken。
答案 1 :(得分:1)
我在方法中添加了ALTER TABLE MY_TABLE ADD STATUS2 NVARCHAR2(10) DEFAULT 'OPEN';
ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_CHECK_STATUS CHECK (STATUS2 IN ('OPEN', 'CLOSED'));
UPDATE MY_TABLE SET STATUS2 = STATUS;
ALTER TABLE MY_TABLE DROP COLUMN STATUS;
ALTER TABLE MY_TABLE RENAME COLUMN STATUS2 TO STATUS;
。这导致模型可以在验证中正常工作。
If ModelState.IsValid Then