2016-04-14 2 views
1

У меня есть проект на C#, который имеет некоторые административные функции за экраном входа.Как предотвратить повторное использование авторизации после выхода из системы

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

Полный контроллер «Admin» установлен в [Authorize] с соответствующими установленными ролями. При выходе из системы я звоню

FormsService.SignOut(); 
Session.Clear(); 
Session.Abandon(); 

и перенаправляет пользователя на стартовую страницу.

Все, что я прочитал, указывает на то, что это должно быть все, что мне нужно для предотвращения этого. Тем не менее, я могу сделать следующее:

  1. Войдите в моей администрации области
  2. Выполните поиск (действие JSON POST, захваченный в отрыжки)
  3. результаты смотри поиск
  4. Выход
  5. Повторите JSON в POST отрыжки (который содержит печенье An «.ASPXAUTH»)
  6. См ответ сервера в отрыжки, который соответствует ранее ответ

Что я могу сделать, чтобы предотвратить это?

+0

Во избежание повторных атак вы можете использовать аутентификацию с запросом-ответом с помощью nonce. –

+0

'Session.Abandon' должен очистить сеанс на стороне сервера; это не должно работать. – SLaks

+0

@SLaks: Итак, я прочитал. Тем не менее, это все еще происходит. Я сам провел тестирование. – Jeff

ответ

0

Итак, после намного большего количества экспериментов я нашел решение!

Когда пользователь входит в систему, я делаю следующее:

System.Web.HttpContext.Current.Application.Lock(); 
System.Web.HttpContext.Current.Application[HttpContext.User.Identity.Name] = true; 
System.Web.HttpContext.Current.Application.UnLock(); 

и я отменить его, когда пользователь выходит из системы (перед умерщвлением сессии может подписать их из FormsService).

Тогда я воспользоваться тем фактом, что у нас уже есть custom AuthorizeAttribute override сделать это в методе «OnAuthorization»:

/* Some other customer stuff that isn't relevant */ 

base.OnAuthorization(filterContext); 

if (System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name] != null && 
    ((bool)System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name]) == true) 
{ 
    //The user is ok to log in, and should be validated now. 
} 
else 
{ 
    HandleUnauthorizedRequest(filterContext); 
} 

путем сохранения пользователя, вошедшего в состоянии в состоянии приложения, я в состоянии подтвердить свой статус.

Некоторые люди, похоже, считают, что статический класс будет лучше, чем доступ к состоянию приложения в MVC, но приложение для меня лучше в этом случае (в основном потому, что оно более знакомо другим людям, которые будут поддерживать кода и для удобства тестов Unit).