防伪验证在MVC 4中不起作用

时间:2014-03-11 08:34:08

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

我在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)

/// .......表单元素.... // }

2 个答案:

答案 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