我正在构建示例单页应用程序。为此,我按照Microsoft的教程构建了Web API。我成功实现了会话和csrf令牌。但是,我已经使用其他框架多次构建了后端(这是因为该项目将展示我使用不同语言的各种框架的工作)并保持一致性,在其他框架中,我必须在登录之前实现会话,并且csrf机密存储在会话中。因此,在登录时,将通过ajax标头验证csrf令牌,更改该令牌,并为登录的用户创建一个新会话。注销时也会发生同样的情况。 Laravel和Django是此实现的示例。在ASP.NET Core中,我无法找到一种方法来执行此操作,因为在关闭浏览器之前会话始终是相同的,因此当我与邮递员进行测试时,我永远都无法重新生成ID,更不用说了创建一个新会话。 CSRF的秘密在于它自己的防伪cookie,而不是与会话绑定。无论如何,我可以在ASP.NET Core中实现它吗?
这里是为了以防万一,但是我怀疑您会需要它:
Startup.cs
public void ConfigureServices(IServiceCollection services)
services.AddAntiforgery(options => {
// Set Cookie properties using CookieBuilder properties
options.HeaderName = "X-XSRF-TOKEN";
options.SuppressXFrameOptionsHeader = true;
});
services.AddMvc()
.AddMvcOptions(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));
// other services ommitted
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IAntiforgery antiforgery) {
app.Use(next => context => { // set up csrf middleware
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append(
Environment.GetEnvironmentVariable("XSRF_COOKIE"),
tokens.RequestToken,
new CookieOptions() {
MaxAge = TimeSpan.FromMinutes(sessionLifetime),
HttpOnly = false ,
Secure = Environment.GetEnvironmentVariable("APP_ENV") != "local"
});
return next(context);
});
}