【发布时间】:2021-04-01 19:47:11
【问题描述】:
我正在尝试实现 .net Core 3.1 框架中提供的防伪机制,但是在尝试发送需要验证的请求时,我总是收到 400 Bad Request。该应用程序是一个使用 Odata、Entity Framework、Oracle 的 web api。它使用 JWT 进行身份验证和授权。它目前按预期工作,但我被要求将 JWT 保存在 cookie 中,因此我需要针对 XSRF 攻击实施某种安全措施。
我知道这似乎是一个重复的问题,但我认为我已经遵循了我遇到的每个建议的答案,但无济于事。
在我拥有的 ConfigureServices 中
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"
});
使用邮递员时,我可以登录并获取 cookie。我可以成功发出 GET 请求,但每次尝试执行需要 antiForgeryValidation 的 POST 请求时,我都会收到 400 Bad Request 响应。如果我禁用特定 POST 端点的验证,则该端点可以正常工作。
在每个请求中,我设置了标头 X-XSRF-TOKEN,并且我分配给它的值等于 XSRF-TOKEN 的值。类似的东西
CfDJ8LjjmjsmmflNk1FyHauE92b4PAjyLk1a1uwJhdrkDydkihsu5yBE3K54ZmF2dl6716tjhpmHUzukg1aW1ubXQzCrZjO0xIgrw-282MH2CLrHcPavgtTJ2TnrYnALJz-mUKiMqkIQHYpicnO9jJaGZrA
邮递员中的请求看起来像这样:
当执行这样的请求时,我可以在 context.Request 中看到令牌(所有 4 个 cookie,包括 X-XSRF-TOKEN 和值,这是我在 PostMan 中设置的)
我完全糊涂了,这个实现似乎特别容易,但我无法正确完成。请帮忙。
【问题讨论】:
-
c#(尤其是用户代理)中的默认 HTTP 标头与 postman 不同。我会确保您在 c# 请求中添加与您在邮递员中看到的完全相同的标头。
标签: c# asp.net-core antiforgerytoken