Проблема с подделкой на некоторых Android устройствах - PullRequest
0 голосов
/ 30 марта 2020

У меня есть веб-приложение. NET Core 3.1.3, в котором используется защита от подделки. Все отлично работает на chrome на десктопе и некоторых планшетах. Он отлично работает на Android устройствах с Firefox. Однако на Chrome некоторых Android устройствах с 8.1 на них возвращается 400 ошибок для любого ajax вызова, для которого включена защита от подделки.

Некоторый код:

Форма:

<form id="appForm" method="post" role="form">
    @Html.AntiForgeryToken(); 

Контроллер:

    [AllowAnonymous]
    [IgnoreAntiforgeryToken] // adding this to disable anti forgery makes the ajax call work
    //[DisableCors]
    [HttpPost]
    public async Task<JsonResult> AddProduct(int productId)
    {

Ajax:

 $.ajax({
        url: "/Cart/AddProduct/",
        data: {
            __RequestVerificationToken: $("[name='__RequestVerificationToken']").val(),
            productId: $(this).data("productcode")
        },
        dataType: "json",
        type: "POST",

Startup.cs

 services.AddAntiforgery(o =>
        {
            o.FormFieldName = "__RequestVerificationToken";
            o.HeaderName = "X-XSRF-TOKEN";
            //o.SuppressXFrameOptionsHeader = true;
            o.Cookie.SameSite = SameSiteMode.None;
            o.Cookie.Expiration = TimeSpan.FromDays(7);
        });

Если отключить защиту от подделки, добавив Атрибут [IgnoreAntiforgeryToken] для моего контроллера, тогда вызов ajax работает на устройстве Android. В противном случае он возвращает ошибку 400.

Он работает на устройстве с Android 9. *, но не на телефоне и планшете с Android 8.1 на них.

Может кто-нибудь предложить что-нибудь что может быть причиной этого? У меня нет идей и я быстро иду лысым.

спасибо

nb: явное использование @ Html .AntiForgeryToken () не обязательно, потому что Core добавит токен для любых форм с метод POST. Но я хотел попробовать добавить его явно, чтобы увидеть, решит ли он проблему. Увы нет.

1 Ответ

0 голосов
/ 31 марта 2020

Это оказалось политикой повара ie. Чтобы исправить, в файле startup.cs используйте:

SameSiteMode.Unspecified;

Unspecified использует требования клиента. Chrome жаловался на Самсайт = Нет.

...