我正在尝试实现 .net Core 3.1 框架中提供的防伪机制,但是在尝试发送需要验证的请求时,我总是收到 400 Bad Request。该应用程序是一个使用 Odata、Entity Framework、Oracle 的 web api。它使用 JWT 进行身份验证和授权。它目前按预期工作,但我被要求将 JWT 保存在 cookie 中,因此我需要实施某种针对 XSRF 攻击的安全措施。
我知道这似乎是一个重复的问题,但我想我已经遵循了我遇到的所有建议答案,但无济于事。
在我的配置服务中
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options
//.AllowAnyOrigin()
.WithOrigins("https://localhost:5001")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
);
});
services.AddAntiforgery(options =>
{
// Set Cookie properties using CookieBuilder properties†.
options.HeaderName = "X-XSRF-TOKEN";
options.SuppressXFrameOptionsHeader = false;
//options.Cookie.Name = "XSRF-TOKEN";
});
services.AddMvc(o =>
{
o.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
我有一个允许用户登录的专用端点,它生成软件所需的 cookie,包括防伪 cookie(XSRF-TOKEN 和 .AspNetCore.Antiforgery.IwdqSLfpWIs)
var aft = _antiForgery.GetAndStoreTokens(HttpContext);
Response.Cookies.Append("XSRF-TOKEN", aft.RequestToken, new CookieOptions
{
HttpOnly = false
//,IsEssential = true
,Secure = true
//TODO: Varias de entorno
,Domain = "localhost"
});
使用 postman 时,我可以登录并获取 cookie。我可以成功发出 GET 请求,但每次尝试执行需要 antiForgeryValidation 的 POST 请求时,我都会收到 400 Bad Request 响应。如果我禁用对特定 POST 端点的验证,则该端点可以正常工作。
在每个请求中,我都设置了标头 X-XSRF-TOKEN,我分配给它的值等于 XSRF-TOKEN 的值。类似的东西
CfDJ8LjjmjsmmflNk1FyHauE92b4PAjyLk1a1uwJhdrkDydkihsu5yBE3K54ZmF2dl6716tjhpmHUzukg1aW1ubXQzCrZjO0xIgrw-282MH2CLrHcPavgtTJ2TnrYnALJz-mUKiMqkIQHYpicnO9jJaGZrA
邮递员中的请求看起来像这样:
执行这样的请求时,我可以在上下文中看到令牌。请求(所有 4 个 cookie,包括 X-XSRF-TOKEN 和值,这是我在 PostMan 中设置的那个)
我很困惑,这个实现似乎特别容易,但我无法正确地做到这一点。请帮忙。
答案 0 :(得分:0)
我的错误是尝试在单个请求中进行登录并“一次性”设置防伪 cookie。一旦我在一个请求中登录并在另一个请求中设置了 cookie,一切都按预期工作。