У меня возникла странная проблема с аутентификацией форм. У меня есть собственные классы и классы идентификации, а после входа я устанавливаю 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, заменяется?
Вы понимаете, что FormsAuthentication это печенье на основе, в то время как кэш AppDomain основе, то есть каждый раз в recyles домена приложения, все это потеряно ... –
приложение пул не будет переработаны. На самом деле вы напомнили мне, что утилизация пула приложений, похоже, немного исправляет проблему. Срок действия файла cookie истекает одновременно с сеансом. Проблема заключается не в том, что кеш теряется, так как я могу проследить вышеприведенный код и посмотреть, как правильно вытащить главный, и буквально через несколько секунд в page_load у меня другой руководитель. – Andy
Вы никогда не должны устанавливать сеанс истечения срока действия одновременно с файлом auth cookie. http://completedevelopment.blogspot.com/2009/12/caution-with-using-sessiontimeout-and.html –