защита от подделки, останавливающая запись базовой страницы razor с ошибкой 400

#asp.net-core #razor-pages #antiforgerytoken

#asp.net-ядро #razor-страницы #antiforgerytoken

Вопрос:

Я получал ошибку 400 и сократил код до очень простой записи формы, и все равно получаю эту ошибку.

Это происходит только один раз при первой попытке (т. Е. При первой загрузке страницы, затем вернитесь назад, нажмите кнопку и все ок)

Я обнаружил, что это связано с «защитой от подделки», и если я отключу это, все будет работать идеально в первый раз

 <div class="text-center">
<form method="post">
    <button id="btnLogin" type="submit" asp-page-handler="BtnSignin">Login</button>
</form>
 

Выше приведен мой HTML, а ниже — c#:

 public async Task<IActionResult> OnPostBtnSignin()
    {
        return null;
    }
 

(я знаю, что возврат null не идеален, но для моей отладки он подтверждает, получаю ли я ошибку 400 или нет)

если я опубликую (в aws lambda), при первом нажатии кнопки произойдет ошибка, вернитесь назад, нажмите кнопку, и на этот раз ошибки нет

если я отключу «защиту от подделки», это сработает (пробовал, и это работает в любом случае)

Есть идеи о том, почему? и как это исправить? (без отключения защиты от подделки)

Ответ №1:

Попробуйте добавить @Html.AntiForgeryToken() в свою форму:

 <form method="post">
    @Html.AntiForgeryToken()
    <button id="btnLogin" type="submit" asp-page-handler="BtnSignin">Login</button>
</form>
 

Оба <form method="post"></form> и @Html.AntiForgeryToken() приведут к добавлению на страницу скрытого поля __RequestVerificationToken.Поэтому, если ваша форма не может добавить __RequestVerificationToken на страницу, вы можете попробовать добавить @Html.AntiForgeryToken() .