FormsAuthentication.RedirectToLoginPage () ничего не делает - PullRequest
1 голос
/ 04 декабря 2011

У меня следующая проблема: повторная публикация веб-приложения ASP.NET вызывает (как и ожидалось) сброс сеанса, где я храню дополнительную информацию о пользователе (что при попытке доступа вызовет исключение NullReferenceException).

Чтобы избежать этого, моя страница проверяет существование этой информации и, в случае нулевого значения, перенаправляет пользователя на страницу входа (формы auth), поэтому я звоню:

void LogOut()
{
    Session.Clear();
    Session.Abandon();
    User = null;
    FormsAuthentication.SignOut();
    FormsAuthentication.RedirectToLoginPage()
}

Но иногда это не помогает, поэтому я нашел обходной путь:

Response.Redirect(FormsAuthentication.LoginUrl);

но он не добавляет returnUrl, как мне хотелось бы (я не хочу эмулировать это поведение вручную).

Так что хочу выяснить, почему первый способ не работает, как ожидалось.

Ответы [ 2 ]

5 голосов
/ 11 декабря 2011

Вы пытались звонить Response.End() после FormsAuthentication.RedirectToLoginPage()?

1 голос
/ 11 декабря 2011

У меня следующая проблема: повторная публикация веб-приложения ASP.NET вызывает (как и ожидалось) сброс сеанса, где я храню дополнительную информацию о пользователе (что при попытке доступа вызовет исключение NullReferenceException).

Но иногда этоне помогает

Я не уверен, что вы подразумеваете под «иногда это не помогает» - вы не говорите, что именно происходит.

Но вы должны помнитьчто истечение срока действия билета проверки подлинности с помощью форм и истечение времени ожидания сеанса полностью независимы.Сеанс пользователя может быть приостановлен, пока его билет проверки подлинности с помощью форм еще действителен, и наоборот.

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

object o = Session["Whatever"];
if (o == null)
{
    o = ... refresh it e.g. from the database
    Session["Whatever"] = o;
}
...

Часто полезно использовать вспомогательный класс для инкапсуляции этого.

В вашем случае вы ссылаетесь на "дополнительную информацию о пользователе" - так что вы, вероятно, сможете получить ее, используя HttpContext.Current.User.Identity.Name какключ.

Заставить пользователя снова войти в систему из-за истечения сеанса, например, из-за перезапуска пула приложений на сервере, очень недружелюбно.

ОБНОВЛЕНИЕ

В документации MSDN для RedirectToLoginPage указано, что:

В отличие от метода HttpResponse.Redirect, этот метод не завершает запрос, вызывая HttpResponse.End.Это означает, что будет выполняться код, следующий за вызовом метода RedirectToLoginPage.

Это, вероятно, объясняет то, что вы видите: код в жизненном цикле страницы после выполнения вызова RedirectToLoginPage и бросокNullReferenceException.

Вы можете позвонить Response.End после RedirectToLoginPage, чтобы избежать этого.

Тайм-аут моего сеанса установлен = Тайм-аут авторизации форм (через web.config).

Я бы еще раз повторил, что истечение срока действия сеанса и истечения срока действия FormsAuthentication не связаны, даже если тайм-ауты оказываются одинаковыми.Файл cookie FormsAuthentication выдержит перезапуск пула приложений на сервере;сеанса не будет.

...