Внешняя компания провела некоторые тесты на проникновение в приложение ASP.NET MVC 5, над которым я работаю.
Проблема, которую они подняли, описана ниже
Файл cookie, связанный с управлением сеансом, называется AspNet.ApplicationCookie. При вводе вручную приложение аутентифицирует пользователя. Несмотря на то, что пользователь выходит из приложения, cookie все еще действует. Это означает, что старый сеансовый файл cookie может использоваться для проверки подлинности в течение неограниченного периода времени. В тот момент, когда старое значение вставлено, приложение принимает его и заменяет собой вновь созданный файл cookie. Поэтому, если злоумышленник получает доступ к одному из существующих файлов cookie, будет создан действительный сеанс с тем же доступом, что и в прошлом.
Мы используем ASP.NEt Identity 2.2
Здесь наше действие выхода на контроллер учетной записи
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Login", "Account");
}
в startup.auth.cs
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromHours(24.0),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator
.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>(
validateInterval: TimeSpan.FromMinutes(1.0),
regenerateIdentityCallback: (manager, user) =>
user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (Int32.Parse(id.GetUserId())))
}
});
Я бы подумал, что структура позаботилась бы о недействительности старого cookie сеанса, но просматривая исходный код Owin.Security, он выглядит не так.
Как я могу аннулировать cookie сеанса при выходе из системы?
отредактируйте Джейми Данстан Совет добавил AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
, но потом ничего не изменилось. Я все еще могу выйти из приложения, клонировать ранее проверенный запрос в Fiddler и принять его приложением.
Изменить: Мой обновленный способ выхода из системы
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> LogOff()
{
var user = await UserManager.FindByNameAsync(User.Identity.Name);
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
await UserManager.UpdateSecurityStampAsync(user.Id);
return RedirectToAction("Login", "Account");
}