【发布时间】:2022-01-01 13:09:02
【问题描述】:
我正在使用 Angular 13 和 ASP.Net Core5。我正在尝试使用 ValidateAntiForgeryToken 属性并且总是得到 400 错误。在我发布这个问题之前,我尝试了几乎所有在互联网上找到的解决方案。但是,我想澄清一下我的情况,我正在创建一个多租户应用程序。每个企业主都将拥有一个子域和单独的数据库。我不知道 Antiforgery 令牌是否由于这种情况而无法正常工作,但我尝试了 3 天的许多解决方案。
Startup.cs
services.AddAntiforgery(options =>
{
options.Cookie.Name = "XSRF-TOKEN";
options.HeaderName = "X-XSRF-TOKEN";
options.Cookie.HttpOnly = false;
});
我使用了这个配置并且 ASP.NET 发送了名为 XSRF-TOKEN 的防伪 cookie。根据 Angular 文档,如果存在名为 X-XSRF-TOKEN 的 cookie,Angular 将发送一个名为 X-XSERF-TOKEN 的标头。实际上,Angular 每次请求都成功发送了它,但我仍然收到代码 400 的错误。
我尝试手动添加 X-XSRF-TOKEN。我尝试使用以下中间位置
app.Use(next => context =>
{
if (
string.Equals(context.Request.Path.Value, "/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(context.Request.Path.Value, "/index.html", StringComparison.OrdinalIgnoreCase) ||
string.Equals(context.Request.Path.Value, "/api", StringComparison.OrdinalIgnoreCase))
{
// We can send the request token as a JavaScript-readable cookie, and Angular will use it by default.
var tokens = antiForgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,
new CookieOptions() { HttpOnly = false, Secure = false });
}
return next(context);
});
我尝试在 startup.cs 中使用 CORS
services.AddCors(c => { c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); });
app.UseCors(policy =>
{
policy.AllowAnyOrigin();
policy.AllowAnyHeader();
policy.AllowAnyMethod();
});
然后为控制器添加[EnableCors(PolicyName = "AllowOrigin")]。
我尝试了这些解决方案的组合,但仍然遇到同样的错误。
【问题讨论】:
标签: c# angular asp.net-core asp.net-web-api