在 .Net Core 3.1 上启用 antiForgery 导致 BadRequest
Enabling antiForgery on .Net Core 3.1 results in BadRequest
我正在尝试实施 .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 端点的验证,则此类端点可以正常工作。
在每个请求中,我设置 header X-XSRF-TOKEN 并且我分配给它的值等于 XSRF-TOKEN 的值。像
CfDJ8LjjmjsmmflNk1FyHauE92b4PAjyLk1a1uwJhdrkDydkihsu5yBE3K54ZmF2dl6716tjhpmHUzukg1aW1ubXQzCrZjO0xIgrw-282MH2CLrHcPavgtTJ2TnrYnALJz-mUKiMqkIQHYpicnO9jJaGZrA
邮递员中的请求看起来像这样:
当执行这样的请求时,我可以在 context.Request 中看到令牌(所有 4 个 cookie,包括 X-XSRF-TOKEN 和值,这是我在 PostMan 中设置的)
我很困惑,这个实现看起来特别容易,但我做不好。请帮忙。
我的错误是试图在单个请求中“一次性”登录并设置防伪 cookie。一旦我在一个请求中登录并在另一个请求中设置 cookie,一切都按预期进行。
我正在尝试实施 .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 端点的验证,则此类端点可以正常工作。
在每个请求中,我设置 header X-XSRF-TOKEN 并且我分配给它的值等于 XSRF-TOKEN 的值。像
CfDJ8LjjmjsmmflNk1FyHauE92b4PAjyLk1a1uwJhdrkDydkihsu5yBE3K54ZmF2dl6716tjhpmHUzukg1aW1ubXQzCrZjO0xIgrw-282MH2CLrHcPavgtTJ2TnrYnALJz-mUKiMqkIQHYpicnO9jJaGZrA
邮递员中的请求看起来像这样:
当执行这样的请求时,我可以在 context.Request 中看到令牌(所有 4 个 cookie,包括 X-XSRF-TOKEN 和值,这是我在 PostMan 中设置的)
我很困惑,这个实现看起来特别容易,但我做不好。请帮忙。
我的错误是试图在单个请求中“一次性”登录并设置防伪 cookie。一旦我在一个请求中登录并在另一个请求中设置 cookie,一切都按预期进行。