2010-01-25 1 views
5

У меня есть приложение MVC, которое использует [Авторизовать] для защиты частных битов. Когда я выбираю URL SignOut(), он меня выписывает, но если я нажму кнопку «Назад» в своем браузере, он перейдет на защищенную страницу и даже позволит мне использовать форму. Действие происходит, а затем оно показывает, что я вышел из системы. Проблема в том, что он выполняет защищенное действие (вставка строки в мою базу данных). Затем я снова могу использовать кнопку «Назад» и делать все это. Если я использую кнопку «Назад» после выхода из системы и нажимаю обновление браузера, он показывает, что я вышел из системы и отказывается от доступа к защищенной странице.Использование кнопки браузера после того, как SignOut() позволяет получить доступ к защищенной странице (ASP.NET MVC)

Я пропустил что-то важное? Похоже, что это может быть действительно серьезная проблема безопасности.

public ActionResult LogOff(string ReturnUrl) 
{ 

    FormsAuth.SignOut(); 

    if (!String.IsNullOrEmpty(ReturnUrl)) 
    { 
     return Redirect(ReturnUrl); 
    } 
    else 
    { 

    return RedirectToAction("Index", "Page"); 
    } 
} 
+4

Вы забыли обернуть [Авторизовать] вокруг действия, которое принимает сообщение (выше [AcceptVerbs (HttpVerbs.Post)]? – Langdon

+0

Нет, но когда я вернулся, чтобы посмотреть у меня было так: \t \t [AcceptVerbs (HttpVerbs.Get)] \t \t [Авторизоваться (Роли = "Администратор")] и \t \t [AcceptVerbs (HttpVerbs ,Post)] \t \t [Авторизовать (Роли = «Администратор»)] Когда я добавляю флаг Authorize перед AcceptVerbs для Get и Post, он все же позволяет мне вернуться к форме, но это не позволит мне публиковать его , – mark123

+0

Мне все еще хотелось бы не показывать безопасную форму, разрешает ли она отправлять сообщения обратно или нет. Это странная проблема. С помощью [Авторизованного] оформления мне не нужно проверять наличие IsAuthenticated, должен ли я? \t \t \t if (! User.Identity.IsAuthenticated) {return RedirectToAction («LogOn», «Account»);} – mark123

ответ

5

Я думаю, проблема в том, что браузер кэширует страницу. Вот почему он не перезагружает страницу после нажатия кнопки «Назад». Если вы указываете в заголовках, что страница не должна кэшироваться, она должна перезагрузить страницу после нажатия кнопки «Назад». И тогда пользователю отказывают.

Однако в некоторых случаях это может быть сложно. См. Это Caching Tutorial для получения дополнительной информации.

1

Вы используете информацию о сеансе? FormsAuth.SignOut() влияет только на новые экземпляры страницы. Когда вы вернулись, вы были уполномочены находиться там (ранее). PostBack разрешен, если у вас нет проверки кода для файла cookie/сеанса/подлинности запроса. Он даже обходит global.asax, потому что ViewState уже сгенерирован.

Возможно, вы захотите добавить заявление об убийстве сеанса или предоставить дополнительные проверки подлинности в базовых классах, чтобы убедиться, что пользователю действительно разрешено находиться там, где они есть. КОГДА они есть.

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

+0

Он использует MVC, поэтому postbacks и viewstates не должны быть проблемой. Однако использование 'Session.Abandon()' в элементе управления выводом является хорошей идеей. –

+0

В этом случае я не использую информацию сеанса. – mark123

3

Устранение сбоя может помочь. здесь мой метод выхода:

public ActionResult Signout() 
    { 
     Session.Clear(); 
     FormsAuthentication.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 
1

это до конца ответа, но я надеюсь, чтобы помочь любому в то время в Global.asax добавить этот метод

protected void Application_BeginRequest() 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); 
    Response.Cache.SetNoStore(); 
} 

, а затем после того, как основное действие добавить эту проверку

if (Request.IsAuthenticated) 
{ 
    // do something 
} 
else 
{ 
    return RedirectToAction("LoginPage", "ControllerName"); 
} 

(основное действие означает любое [httpget] действие) и он будет работать очень, я надеюсь помочь

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