2015-12-01 3 views
14

Внешняя компания провела некоторые тесты на проникновение в приложение ASP.NET MVC 5, над которым я работаю.Invalidate Old Session Cookie - Identity ASP.Net

Вопрос, который они подняли описано ниже

печенья, связанный с управлением сеансом называется AspNet.ApplicationCookie. При вводе вручную приложение аутентифицирует пользователя. Несмотря на то, что пользователь выходит из приложения, cookie все еще действует. Это означает, что старый сеансовый файл cookie может использоваться для проверки подлинности в течение неограниченного периода времени. В тот момент, когда старое значение вставлено, приложение принимает его и заменяет собой вновь созданный файл cookie. Поэтому, если злоумышленник получает доступ к одному из существующих файлов cookie, будет создан действительный сеанс с тем же доступом, что и в прошлом.

Мы используем ASP.net Идентичность 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 сеанса при выходе из системы?

Редактировать на форуме Jamie Dunstan Я добавил AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);, но потом ничего не изменилось. Я все еще могу выйти из приложения, клонировать ранее проверенный запрос в Fiddler и принять его приложением.

Edit: Мой обновленный метод Logoff

[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"); 
    } 
+0

Вы пытались заменить 'AuthenticationManager.Signout();' на 'AuthenticationManager.Signout (DefaultAuthenticationTypes.ApplicationCookie);'? Беззнаковое выступление выглядит немного непоследовательным. –

+0

Cheers. Выполнено, но я все еще могу выйти из приложения, а затем клонировать ранее проверенный запрос в скрипт и принять его – MrBliz

+0

Я также удалил Expiretimespan из startup.Auth. Нет разницы. – MrBliz

ответ

5

Убедитесь, что вы используете 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 для обновления временных меток.

+1

И вот еще один вопрос с почти таким же ответом: http://stackoverflow.com/a/34016721/809357 – trailmax

+0

Спасибо, я могу подтвердить, что все вышесказанное на месте. Я изменил validateInterval на validateInterval: TimeSpan.FromMinutes (1.0). Я могу сделать аннулированный запрос, выйти из системы, подождать 5 минут и клонировать этот запрос, и он все равно будет аутентифицирован. Вы говорите, что это должно произойти по дизайну? – MrBliz

+0

@MrBliz правильный - по дизайну. Если вы не измените штамп безопасности, старый файл cookie будет аутентифицирован вами. Cookie хранит имя пользователя, userId, марку безопасности, некоторые временные метки и бит другой информации (здесь немного больше информации: http://tech.trailmax.info/2014/08/aspnet-identity-cookie-format/). И методы 'SignOut()' просто убивают файл cookie. Но если один и тот же файл cookie будет снова воспроизведен, он примет его. То же самое, что вы выходите из одного браузера, а другой еще аутентифицирован. Поэтому, если вам нужно убить все сеансы, вам необходимо обновить марку безопасности одновременно с выходом из системы. – trailmax

0

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

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

Я первоначально было:

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

и не работал.

Смежные вопросы