ValidateAntiForgeryToken ломает страницу

У меня есть веб-приложение ASP .Net Core 1.1 MVC. Когда я добавляю украшение [ValidateAntiForgeryToken] в свои контроллеры редактирования/удаления/создания, страницы не загружаются (ошибка HTTP 400). Есть идеи, почему? Я где-то читал, что мне нужно добавить соответствующий @HtmlHelper.AntiForgeryToken в свои представления или что-то в этом роде? Но не уверен, куда его поместить... Однако я также читал, что в ASP .Net Core это больше не нужно делать...

Вот пример моего представления редактирования для контроллера «Пользователи»:

@model InspectionsData.Models.User

@{
    ViewData["Title"] = "Edit";
}

<h2>Edit</h2>

<form asp-action="Edit">
    <div class="form-horizontal">
        <h4>User</h4>
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group" hidden>
            <label asp-for="UserId" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="UserId" class="form-control" />
                <span asp-validation-for="UserId" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="FirstName" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="FirstName" class="form-control" />
                <span asp-validation-for="FirstName" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="LastName" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="LastName" class="form-control" />
                <span asp-validation-for="LastName" class="text-danger"></span>
            </div>
        </div>
    </div>
</form>

<div>
    <a asp-action="Index">Back to List</a>
</div>

Спасибо


person Fabricio Rodriguez    schedule 15.06.2017    source источник
comment
Куда вы поместили атрибут? Потому что, если вы поставите его на действия, которые возвращают форму, вы получите ошибки. Это должно быть в действиях, которые запускаются формой POST. Можете ли вы добавить свой код контроллера к вопросу?   -  person juunas    schedule 15.06.2017


Ответы (2)


Вам нужно изменить объявление формы на что-то вроде следующего.

<form asp-controller="User" 
    asp-action="Edit" method="post" asp-antiforgery="true">

Как вы упомянули, asp-antiforgery="true" может быть необязательным, но мне нравится всегда добавлять его, чтобы убедиться, что я показываю свои намерения. Это работает для меня каждый раз.

Надеюсь это поможет.

person R. Richards    schedule 17.06.2017

Да вы правы. Вам больше не нужно вручную помещать AntiForgeryToken в ASP.NET Core.

Помощник тега Form создает скрытый токен проверки запроса для предотвращения подделки запроса между сайтами (при использовании с атрибутом [ValidateAntiForgeryToken] в методе действия HTTP Post).

Взято из документов

С учетом сказанного, вы уверены, что ваши действия соответствуют POST запросу?

Также хорошей идеей является указание контроллера.

<form asp-controller="Users" asp-action="Edit">

P.S. Добавление кода для ваших методов действий поможет решить проблему быстрее.

person Kerim Emurla    schedule 17.06.2017