首页 > 解决方案 > 某些 Android 设备的防伪问题

问题描述

我有一个使用防伪的 .NET Core 3.1.3 Web 应用程序。在台式机和某些平板电脑上的 chrome 上一切正常。它在装有 Firefox 的 Android 设备上运行良好。但是,在 Chrome 上,一些带有 8.1 的 Android 设备对于任何启用了防伪的 ajax 调用都会返回 400 错误。

一些代码:

形式:

<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({
        url: "/Cart/AddProduct/",
        data: {
            __RequestVerificationToken: $("[name='__RequestVerificationToken']").val(),
            productId: $(this).data("productcode")
        },
        dataType: "json",
        type: "POST",

启动.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 的手机和平板电脑。

任何人都可以提出任何可能导致这种情况的建议吗?我没有想法,很快就秃了。

谢谢

注意:不需要显式使用@Html.AntiForgeryToken(),因为Core 将为任何带有POST 方法的表单添加一个标记。但我想尝试明确添加它以查看它是否解决了问题。唉,没有。

标签: androidgoogle-chromeasp.net-corehttp-status-code-400antiforgerytoken

解决方案


事实证明这是 cookie 政策。要修复,在 startup.cs 中使用:

SameSiteMode.Unspecified;

未指定使用客户要求。Chrome 一直在抱怨 Samesite = None。


推荐阅读