android - 某些 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 方法的表单添加一个标记。但我想尝试明确添加它以查看它是否解决了问题。唉,没有。
解决方案
事实证明这是 cookie 政策。要修复,在 startup.cs 中使用:
SameSiteMode.Unspecified;
未指定使用客户要求。Chrome 一直在抱怨 Samesite = None。
推荐阅读
- c++ - c ++模拟人造鼠标按下以触发刷新glfw
- android - RecyclerView 对列表的每个项目都有一个实例
- reactjs - React Element Tag 不接受 Function 和 React.Component 类型
- amazon-web-services - 将 S3 存储桶复制到另一个 S3 存储桶的子路径
- django - 模块“whitenoise.storage”未定义“CompressedMainfestStaticFilesStorage”属性/类
- mysql - 存储的 FUNCTION 没有在 MySql 中返回结果?
- java - 可扩展的recyclerview实现
- ios - 如何修复 Xcode 错误 - 类不是键编码
- python - 为什么我必须同时写 'read' 和 'r' 才能使用 pandas 写入文件
- python - 如何解决以下子流程错误?