Могу ли я использовать AntiForgeryToken без тега AcceptVerbs? - PullRequest
0 голосов
/ 17 декабря 2010

Я хотел бы использовать функцию AntiForgeryToken, но сообщение AcceptVerbs не применяется.Я получаю ошибку от подделки.Есть ли способ сделать это без метода post?

public ActionResult Page1(string data)
{   //code with view that includes link to Edit   }

public ActionResult Page2(string data)
{   //code with view that includes link to Edit   }

public ActionResult Edit(string pageName)
{   //execution then redirect to Page1/Page2  }

1 Ответ

2 голосов
/ 17 декабря 2010

Токен защиты от подделки работает с помощью файла 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, только скрытое входное значение кодируется в строке запроса. .

...