gpt4 book ai didi

c# - 为什么 AntiForgeryToken 验证总是失败?

转载 作者:行者123 更新时间:2023-12-03 18:41:51 24 4
gpt4 key购买 nike

我正在开发一个使用 asp.net core2Angular 运行的网络 API 应用程序。详细的开发环境配置为here .我正在尝试配置 AntiForgeryToken 验证,但它一直失败。我按照配置。 here ,但我不得不修改它,因为我的角度应用程序和 asp.net 服务器在两个不同的端口上运行,因为前端启动不会生成 token 。我通过在应用程序组件 ngOnInit 调用 API 路径 (/api/Account/ContactInitialization) 来启动后端,这使我能够生成 token 。配置如下图,

IServiceCollection 服务:

        services.AddAntiforgery(options =>
{
options.HeaderName = "X-CSRF-TOKEN";
options.SuppressXFrameOptionsHeader = false;
});

IApplicationBuilder Configure:

app.Use(next => context =>
{
string path = context.Request.Path.Value;
if (

string.Equals(path, "/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/api/Account/ContactInitialization", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/index.html", 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 });
}

return next(context);
});

http://asp.net.生成两组 key ,

enter image description here

我用 [ValidateAntiForgeryToken] 修饰了我的方法,并在我的 header 请求中包含了 XSRF-TOKEN cookie 内容。但是我在调​​用 API 后一直收到 400 (Bad Request) 响应!我在这里错过了什么?

Controller 方法,

    [Authorize]
[ValidateAntiForgeryToken]
[HttpPost]
public IEnumerable<string> AutherizeCookie()
{
return new string[] { "Hello", "Auth Cookie" };
}

我的详细 header 请求如下所示,

Header Request

最佳答案

我假设您可能关注了 documentation ,但掩盖了相关的部分。到目前为止,您所做的仅适用于 Angular,因为 Angular 的 $http 实际上会根据 XSRF-TOKEN< 添加 X-XSRF-TOKEN header cookies 。 (但是请注意,即便如此,您已将 header 设置为 X-CSRF-TOKEN,它在这里实际上不起作用。它需要是 X-XSRF-TOKEN)。

但是,如果您不使用 Angular,则您有责任在 AJAX 请求中自行设置 header ,而您可能会忽略这一点。在这种情况下,您实际上不需要更改任何防伪 token 配置( header 名称、设置 cookie 等)。您只需提供 header 作为 RequestVerificationToken。例如,使用 jQuery:

$.ajax({
...
headers:
{
"RequestVerificationToken": '@GetAntiXsrfRequestToken()'
},
...
});

这将适用于 View 中的 JavaScript。如果您需要在外部 JS 中执行此操作,则需要设置 cookie,以便您可以从 cookie 中获取值。除此之外,同样的方法适用。

如果您只是想更改 header 名称,您可以这样做;您只需将此处的 RequestVerificationHeader 部分更改为相同的值即可。

关于c# - 为什么 AntiForgeryToken 验证总是失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48038980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com