【发布时间】:2018-09-21 22:40:11
【问题描述】:
我希望在我的 .NET Core 2 API 中使用 XSRF 令牌。 我正在使用 Vue.Js 前端。
我已按照此处的说明正确配置了后端: https://stackoverflow.com/a/44035774/2027404
登录后,我创建了一个名为“XSRF-TOKEN”的 cookie,并在 Vue 中编写了一个拦截器来模仿 AngularJS 的功能,它会查找 cookie 并附加带有标题“X-XSRF-TOKEN”的 XSRF 令牌" 到受 [AutoValidateAntiforgeryToken] 保护的控制器路由 属性。
以下是在持久化 cookie 并完成登录后发出的 Post 请求的示例跟踪:
POST /api/auth/Test HTTP/1.1
Host: localhost:5000
Connection: keep-alive
Content-Length: 0
Origin: http://localhost:5000
X-XSRF-TOKEN: CfDJ8Ku5qKiYnPBCmHLFQRR3pGmv482utwpDs1AssvvtQ1yf2eGgasNE4DOTdxivPLqv5e4TGuG800elYMFyJqTC7bzOfnY0HVCUD-Dw0pn-bkBZeN2GjBBvqMJ79Vcwun4khLe9qlzxyBTB0W1XEu_OJq0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36
Content-Type: application/json;charset=utf-8
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
Referer: http://localhost:5000/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cookie: XSRF-TOKEN=CfDJ8Ku5qKiYnPBCmHLFQRR3pGmv482utwpDs1AssvvtQ1yf2eGgasNE4DOTdxivPLqv5e4TGuG800elYMFyJqTC7bzOfnY0HVCUD-Dw0pn-bkBZeN2GjBBvqMJ79Vcwun4khLe9qlzxyBTB0W1XEu_OJq0
因此,真正的重点是证明不仅发送了我的 cookie,而且还包括了我的 Startup.cs 所期望的标头。
public void ConfigureServices(IServiceCollection services) {
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuer = true,
ValidIssuer = Configuration["JWT:Issuer"],
ValidateAudience = true,
ValidAudience = Configuration["JWT:Audience"],
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:SecretKey"])),
ValidateLifetime = true
};
});
services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
services.AddMvc();
}
我的控制器方法如下:
[HttpPost ("[action]")]
//[Authorize]
[AutoValidateAntiforgeryToken]
public IActionResult Test () {
return Ok ("Working fine!");
}]
我绝对不会做任何愚蠢的事情,比如指向错误的路线。如果我禁用 AVAT 并将 Authorize 与 JWT 一起使用(我的目标是最终同时使用 JWT 和 XSRF 来使用双 cookie 方法来确保安全),我可以获得 200 响应,前提是我在我的请求头...
关于为什么这个现成的功能没有发挥作用有什么想法吗?总是返回 400...
我可以展示更多源代码,但证明在请求跟踪中的布丁中......应该需要的所有数据都在那里。
谢谢
【问题讨论】:
-
您实际上并未发布任何表单数据。该表单将包含一个
__RequestVerificationToken字段,用于验证请求。 -
我不想发布表单数据,因为我提到的另一个 Stack Overflow 链接指定所采取的步骤也适用于 API,并可用于 SPA。或者您的意思是向我的 post 端点添加一个参数会提供所谓的“表单数据”?
标签: c# .net asp.net-core asp.net-core-mvc asp.net-core-webapi