2012-04-05 4 views
1

У меня возникла странная проблема с аутентификацией форм. У меня есть собственные классы и классы идентификации, а после входа я устанавливаю HttpContext.Current.User этому главному, а также сохраняю его в кеше (HttpContext.Current.Cache). Кажется, что через какое-то время начинается странное поведение. Это мой обработчик AuthenticateRequest:Аутентификация форм ASp.net - основные изменения?

protected void Application_AuthenticateRequest(object sender, EventArgs e) { 
    string userName; 

    var formAuthCookie = HttpContext.Current.Request.Cookies[ FormsAuthentication.FormsCookieName ]; 
    var isAuthenticated = HttpContext.Current.Request.IsAuthenticated; 

    if (isAuthenticated || formAuthCookie != null) { 
     if (!isAuthenticated) { 
      var ticket = FormsAuthentication.Decrypt(formAuthCookie.Value); 
      userName = ticket.Name; 
     } 
     else { 
      userName = HttpContext.Current.User.Identity.Name; 
     } 

     var prin = (IPrincipal)HttpContext.Current.Cache[ userName ]; 

     if (prin != null) { 
      HttpContext.Current.User = prin; 
     } 
    } 
} 

Это всегда хорошо работает; пользовательский принцип вытаскивается из кеша и правильно устанавливается в пользователь текущего контекста.

Проблема заключается в том, что когда я добираюсь до загрузки страницы, свойство Page.User имеет GenericPrincipal (без ролей) и FormsIdentity. Я понятия не имею, где это происходит. Конечно, страница тогда не работает, так как пользователь не в правильной роли, хотя FormsAuth позволяет им входить в страницу с ограниченной правкой.

Любые идеи, почему принцесс, установленный в обработчике AuthenticateRequest, заменяется?

+0

Вы понимаете, что FormsAuthentication это печенье на основе, в то время как кэш AppDomain основе, то есть каждый раз в recyles домена приложения, все это потеряно ... –

+0

приложение пул не будет переработаны. На самом деле вы напомнили мне, что утилизация пула приложений, похоже, немного исправляет проблему. Срок действия файла cookie истекает одновременно с сеансом. Проблема заключается не в том, что кеш теряется, так как я могу проследить вышеприведенный код и посмотреть, как правильно вытащить главный, и буквально через несколько секунд в page_load у меня другой руководитель. – Andy

+0

Вы никогда не должны устанавливать сеанс истечения срока действия одновременно с файлом auth cookie. http://completedevelopment.blogspot.com/2009/12/caution-with-using-sessiontimeout-and.html –

ответ

-1

Попробуйте вместо этого:

var formAuthCookie = Context.Request.Cookies[ FormsAuthentication.FormsCookieName ]; 
var isAuthenticated = Context.Request.IsAuthenticated; 

if (isAuthenticated || formAuthCookie != null) { 
    if (!isAuthenticated) { 
     var ticket = FormsAuthentication.Decrypt(formAuthCookie.Value); 
     userName = ticket.Name; 
    } 
    else { 
     userName = Context.User.Identity.Name; 
    } 

    var prin = (IPrincipal)Context.Cache[ userName ]; 

    if (prin != null) { 
     Context.User = prin; 
    } 
} 
+0

Можете ли вы выделить различия между этим и тем, что у меня есть? – Andy

+0

@ Andy - Это небольшой блок кода, изменения очевидны. вы просто изменяете HttpContext.Current. * в контекст. * –

+0

Это не разница. – bang

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