Довольно сложно, да, к счастью, это решено.
Вам необходимо реализовать Application_PreRequestHandlerExecute in Global.asax
вот код
/// <summary>
/// The event occurs just after Initialization of Session, and before Page_Init event
/// </summary>
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
// here it checks if session is reuired, as
// .aspx requires session, and session should be available there
// .jpg, or .css doesn't require session so session will be null
// as .jpg, or .css are also http request in any case
// even if you implemented URL Rewritter, or custom IHttp Module
if (Context.Handler is IRequiresSessionState
|| Context.Handler is IReadOnlySessionState)
{
// here is your actual code
// check if session is new one
// or any of your logic
if (Session.IsNewSession
|| Session.Count < 1)
{
// for instance your login page is default.aspx
// it should not be redirected if,
// if the request is for login page (i.e. default.aspx)
if (!Context.Request.Url.AbsoluteUri.ToLower().Contains("/default.aspx"))
{
// redirect to your login page
Context.Response.Redirect("~/default.aspx");
}
}
}
}
Редактировать 1: Объяснение и заключение
Как один из парней рассказал о жизненном цикле приложений ASP.NET .
Происходит множество событий.
На самом деле события в Global.asax возникают в следующей последовательности
- Validate Request // выглядит просто внутренним механизмом
Выполнить сопоставление URL // выглядит просто внутренним механизмом
Вызовите событие BeginRequest.
- Вызовите событие AuthenticateRequest.
- Вызовите событие PostAuthenticateRequest.
- Вызовите событие AuthorizeRequest.
- Вызовите событие PostAuthorizeRequest.
- Вызовите событие ResolveRequestCache.
- Вызовите событие PostResolveRequestCache.
- Просто выбирает класс, который реализовал IHttpHandler для приложения // выглядит просто внутренним механизмом
- Вызовите событие PostMapRequestHandler.
- Вызовите событие AcquireRequestState. непосредственно перед вызовом этого события asp.net загружает состояние как Session
- Вызовите событие PostAcquireRequestState.
- Вызовите событие PreRequestHandlerExecute.
- вызов метода ProcessRequest
Вывод: Все события до AcquireRequestState не имеют объекта Session, поскольку Session не загружается ASP.Net, поэтому любое событие из * "AcquireRequestState ** событие дает объект Session, поэтому эта проблема решается.
Однако некоторые проверки необходимы, как я уже упоминал в коде выше