Токен защиты от подделки работает с помощью файла cookie и скрытого поля ввода в форме. Они оба содержат одно и то же зашифрованное значение. Когда контроллер обрабатывает действие, помеченное [ValidateAntiForgeryToken]
, он проверяет, совпадают ли значения в cookie и скрытом поле ввода. Если нет - вы получите хорошее исключение.
Вы можете использовать код, подобный этому
Вид:
<% using (var form = Html.BeginForm("DoSomething", "Default")) { %>
<%:Html.ValidationMessageFor(x => x) %>
<%:Html.AntiForgeryToken() %>
<%:Html.Hidden("a", 200) %>
<input type="submit" value="Go"/>
<%}%>
Контроллер:
public class DefaultController : Controller
{
public ActionResult Index()
{
return View();
}
[ValidateAntiForgeryToken]
public ActionResult DoSomething(int a)
{
return View("Index");
}
}
Но тогда сгенерированная форма получает атрибут method="post"
. На стороне контроллера вам не нужно указывать [AcceptVerbs(HttpVerbs.Post)]
. Таким образом, ответ на ваш вопрос заключается в том, что вы можете использовать AntiForgeryToken без атрибута AcceptVerbs. Вам просто нужно использовать метод POST в форме.
Чтобы продолжить с примером, если вы укажете [AcceptVerbs(HttpVerbs.Get)]
в действии и Html.BeginForm("DoSomething", "Default", FormMethod.Get)
, пример не будет работать, поскольку запрос GET не содержит cookie, только скрытое входное значение кодируется в строке запроса. .