Подтвердить что ты не робот

Invalidate Cookie старой сессии - Идентификация ASP.Net

Внешняя компания провела некоторые тесты на проникновение в приложение 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");
    }
4b9b3361

Ответ 1

Убедитесь, что вы используете AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie);, как правильно предложил Джейми.

Возможность входа в систему с тем же файлом cookie снова по дизайну. Identity не создает внутренние сеансы для отслеживания всех зарегистрированных пользователей, и если OWIN получает файл cookie, который попадает во все поля (то есть копии с предыдущего сеанса), он позволит вам войти в систему.

Если вы все еще можете войти в систему после обновления маркера безопасности, скорее всего, OWIN не сможет удержать ApplicationUserManager. Убедитесь, что у вас есть эта строка чуть выше app.UseCookieAuthentication

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

Или, если вы используете DI, возьмите ApplicationUserManager из DI:

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

Также уменьшите validateInterval: TimeSpan.FromMinutes(30) до более низкого значения - я обычно устанавливаю пару минут. Вот как часто Identity сравнивает значения в auth-cookie со значениями в базе данных. И когда сравнение выполнено, Identity восстанавливает cookie для обновления временных меток.

Ответ 2

Ответ Trailmax на месте, я думал, что добавлю, что если кто-то пытается это сделать, а также используя ASP.NET Boilerplate, Следующее - это то, что я использовал для выполнения этой работы:

app.CreatePerOwinContext(() => IocManager.Instance.Resolve<UserManager>());

Я изначально имел:

app.CreatePerOwinContext(() => IocManager.Instance.ResolveAsDisposable<UserManager>());

и не работает.