提问人:user2038084 提问时间:10/23/2023 更新时间:11/3/2023 访问量:106
ASP.Net Core With React Antiforgery token 不起作用
ASP.Net Core With React Antiforgery token not working
问:
我正在尝试使用 ASP.NET Core 7 和 React 开发应用程序,我需要为所有请求实现防伪保护。我已经在网上研究了几天,并尝试了各种解决方案;但是,我仍然不确定如何解决该问题。
以下是我的代码,我可以解决任何其他问题。
程序.CS
builder.Services.AddAntiforgery(
{
options.Cookie.Name = "X-XSRF-TOKEN";
options.Header = "X-XSRF-TOKEN";
});
控制器
[Route("/Test2")]
[ValidateAntiForgeryToken]
[HttpPost]
public PostResponse Test2(PostRequest pr)
{
return RunVehCheck(pr);
}
反应 (.js)
const getCSRFToken = async () => {
const response = await fetch("https://localhost:7277/Test2", {
method: "GET"
});
const csrfToken = await response.json();
return csrfToken;
}
useEffect(() => {
getCSRFToken();
}, []);
const handleSubmit = async (e) => {
e.preventDefault()
fetch("https://localhost:7277/Test2", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-XSRF-TOKEN": getCSRFToken
},
body: JSON.stringify({
"vehicleReg": inputValue.current.value
})
})
.then((res) => {
if (res.status === 200) {
return res.json()
} else {
throw Error("Erro posting data");
}
})
.then((res) => {
console.log("Suucessfully send", res)
})
.catch((er) => {
console.log("Error fetching data", er)
})
}
答:
0赞
pcalkins
11/3/2023
#1
我不得不将这些位添加到事物 ASP.NET 方面(在启动.cs中):
services.AddAntiforgery(options =>
{
options.HeaderName = "XSRF-TOKEN";
});
然后:
var antiforgery = app.ApplicationServices.GetRequiredService<IAntiforgery>();
app.Use((context, next) =>
{
var requestPath = context.Request.Path.Value;
// I only tested one page... you should be able to wild card this or just add each page as needed
if (string.Equals(requestPath, "/WebAPI/Inventory/EditInventoryItem", StringComparison.OrdinalIgnoreCase))
{
var tokenSet = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokenSet.RequestToken!,
new CookieOptions { HttpOnly = false });
}
return next(context);
});
我的前端是 Angular。它有一个组件,您可以使用该组件读取此 cookie 的值“XSRF-TOKEN”,并在每个请求上将其设置为名为“XSRF-TOKEN”的标头。所以你必须做同样的事情。读取 cookie(它设置为 HttpOnly: false,因此您可以执行此操作),然后添加名称为“XSRF-TOKEN”的自定义标头。不要在防伪选项中设置 Cookie 名称。让 ASP.NET 照顾它使用的 cookie。您只需要设置 HeaderName。
评论