Я создаю пример одностраничного приложения.Для этого я следовал инструкциям в Microsoft по созданию веб-API.Я успешно реализовал сессии и токены csrf.Тем не менее, я несколько раз создавал бэкэнд с другими фреймворками (это потому, что проект предназначен для демонстрации моей работы с различными фреймворками на разных языках) и для обеспечения согласованности, в других фреймворках мне нужно реализовать сеанс перед входом в систему,и секрет csrf сохраняется в сеансе.Таким образом, при входе в систему токен csrf проверяется с помощью заголовка ajax, токен изменяется, и создается новый сеанс для пользователя, который вошел в систему. То же самое происходит при выходе из системы.Laravel и Django являются примерами этой реализации.В ASP.NET Core я не могу найти способ сделать это, так как сессия всегда одинакова до закрытия браузера, поэтому, когда я тестирую с почтальоном, мне никогда не удается восстановить идентификатор, не говоря уже осоздать новую сессию.Это и секрет 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);
});
}