Вы получаете ответ 400 (Bad Request ), потому что платформа ожидает RequestVerificationToken
как часть запроса. Структура использует это для предотвращения возможных атак CSRF. Если в вашем запросе нет этой информации, платформа вернет неверный запрос 400 . Ваш текущий код не отправляет его.
Вы можете исправить это, отправив явно RequestVerificationToken
Помощник тега формы автоматически создает скрытый ввод со значением атрибута имени __RequestVerificationToken
и сохраняет токен в качестве значения скрытого ввода.
var token = $("[name='__RequestVerificationToken']").val();
var gameid = '@Html.Raw(Model.Id)';
$.ajax({
type: 'GET',
url: url() + "UserGames/HasGame?id=" +gameid,
headers:{ "RequestVerificationToken": token },
success: function (data) {
console.log(data);
},
error: function (req, status, err) {
console.log('Something went wrong', status, err);
}
});
В приведенном выше примере мы используем некоторый код jQuery для получения элемента ввода с именем __RequestVerificationToken
и чтения его значения. Более надежный подход - внедрить реализацию IAntiforgery
в представление и использовать метод GetAndStoreTokens
.
Мы будем вводить IHttpContextAccessor
в вид. Поэтому убедитесь, что он правильно подключен к DI. Добавьте эту строку в метод ConfigureServices
ваших классов запуска.
services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
Теперь, по вашему мнению, вы можете ввести IHttpContextAccessor
и IAntiforgery
, а затем вызвать GetAndStoreTokens
, чтобы получить токен. Здесь я обернул это в вспомогательную функцию.
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContext
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
return Xsrf.GetAndStoreTokens(HttpContext.HttpContext).RequestToken;
}
}
Теперь позже в моем js я могу вызывать этот метод внутри своего кода javascript вместо использования jQuery для получения входного значения.
var token = "@GetAntiXsrfRequestToken()";
var gameid = '@Html.Raw(Model.Id)';
$.ajax({
type: 'GET',
url: url() + "UserGames/HasGame?id=" +gameid,
headers:{ "RequestVerificationToken": token },
success: function (data) {
console.log(data);
},
error: function (req, status, err) {
console.log('Something went wrong', status, err);
}
});
или Просто удалите оформление атрибута [ValidateAntiForgeryToken]
из метода действия, что исключает эту проверку.
Я рекомендую вам воспользоваться методом [ValidateAntiForgeryToken]
. Отправьте токен как часть вашего запроса (первый подход)