Как таковая, ваша стратегия выглядит нормально для меня, но я бы предпочел другую реализацию:
- Используйте абстрактный класс, производный от System.Web.UI.Page, в качестве базового класса для всех страниц. Допустим, мы называем этот класс BasePage.
- Добавьте виртуальный метод, такой как
IsRefreshHeaderNeeded
- реализация по умолчанию вернет true. Метод будет вызван на этапе PreRender BasePage для добавления в ответ фактического заголовка обновления.
- На странице SessionExpired
IsRefreshHeaderNeeded
будет переопределено для возврата false. (Подобное может понадобиться на таких страницах, как логин или страницы, которые не нуждаются в поддержке сеанса).
- Обновление заголовка / мета для перенаправления на страницу входа будет добавлено на самой странице SessionExpired (на самом деле это логика на странице, зачем размещать ее в глобальном месте). На странице SessionExpired будет, конечно, ссылка для использования для ручной навигации по странице входа (в случае, если перенаправление не работает).
Мастер-страница является шаблоном контента, и я предпочитаю иметь только логику, связанную с этим контентом внутри мастер-страницы.
Еще одна стратегия состоит не в том, чтобы использовать обновление на стороне клиента для истечения срока действия сеанса, а в том, чтобы делать это со стороны сервера, когда вы указываете, что текущий сеанс истек, когда пользователь снова посещает сайт. Более того, вы можете даже реализовать реализацию, которая сохраняет критические данные сеанса в базе данных, чтобы вы могли восстановить сеанс, и с точки зрения взаимодействия с пользователем не будет никакого истечения сеанса.