In my starting phase of Career, My client reported me a peculiar issue. They said that they get redirected to session expired page even before they actually Login.
In that application, We developed a generic methodology, then whenever a user clicks on any action that requires a post back, it first checks whether session is expired or not and if expired then redirects to a custom session expired page. Later, user can click on login link and redirected to Login page.
[As asked by one of my blog readers, There could be many ways for the generic methodology. I have seen people place common code at several place like Master Page, some put in base class that further worked as base class for all the web pages. I used it in a base class. In my view there are other places like Global.asax and methods could be Application_PreRequestHandlerExecute, Application_AcquireRequestState .]
I analyzed that Issue and found that users used to open the website first page which is obviously the Login page and some of them left the page for a while around 15 or more minutes and after that they when they again back to system, used to enter the credentials and click on login button, it redirects them to session expired page.
It left them annoying and even me too. I have myself seen to many application where I open the Login page and after sometime when I enter my Login details but it redirects me to session expired page.
Some of my colleagues was saying, how a session can expire even before successfully login. I have also found many other developers have same question. So I thought of writing a blog post on it.
So first let me explain, how session works
So as you can see above, as soon as user accesses the site and the first page gets opened, the countdown of the session timeout starts. So it does not matter whether you Login or not, session will be expired after the specified amount of time. So if your website does not have a check on session expiration before Login then it wont be visible to your user and even if user Logins after the specified amount of time, A new session will be created.
But so many people get confused about authentication and session. Session start and expire does not have any connection with authentication start and authentication timeout. Authentication works separately.
As you know, A user request any Page, It goes through many HTTPModules and lastly served by a HTTPHandler. We can show it pictorially as
As you can see, An asp.net request goes through many HTTPModules and finally served by a HTTPHandler. Many features of ASP.NET are developed as HTTP Module. Session and Authentication are also developed as HTTPModules . For session handling we have SessionStateModule which is available under the namespace System.Web.SessionState and various Authentication mechanism in ASP.NET like Form Authentication is also available via a HTTPModule FormsAuthenticationModule which is under the namespace System.Web.Security. So these two are separate modules and works independently.
Normally in our application, as soon as user clicks on sign out, we used to kill session. Normally, we set authentication time out and session timeout same but what may happen if we have
<forms timeout="15" loginUrl="Login.aspx" name=".ASPXFORMSAUTH">
What could happen
As you can see in the above scenario, I have set session time out is less than authentication timeout. After browsing for 5 mins, I left it for around 12 mins and my session got timeout. As my session time out is 10 mins while my authentication time out is 15 mins. But I’ll be still authenticated and able to browse application even my session expired and got recreated and my existing session data will be lost.
So normally we put the authentication time out and same time out as same. This is just first step to avoid the discrepancy between the timeout of Authentication and Session.
But at certain browsers, it behaves differently. Like Session gets time out if the last request made was 10 (in my example session timeout is 10 minutes) or more minutes and on every request the counter get resets for 10 minutes but Authentication timeout does not work in same ways in different browsers. Like if have authentication timeout for 10 minutes, the authentication timeout counter does not get reset on every request to 10 minutes. Sometimes there are some performance improvement has been done which resets on the counter only at certain points say if after 5 or 7 minutes as to reset the authentication timeout on very request is costly. And this may lead to discrepancy.
Other scenario, If some how IIS gets reset the sessions of the users connected to that web server will become invalid while the user authentication will still be valid.
To avoid any unprecedented event like above, I put a check for an authentication and session on every page, So that user cannot continue further if session or authentication is not valid. Also if we found user is not authenticated any more then used to clear and abandon the session and redirects the user to login page. Similarly, if session is not available then the remove the user the authentication as well.
Also, at the time of user clicking on Logoff, one should clear and abandon the session. So that same session is not available after Logoff.
So as you can see, that session and authentication works separately and they work parallely and independently.
So for the problem stated earlier in this post, I suggested a solution to avoid the issue but you can yourself can put your own logic to prevent the issue.
Hope you all have enjoyed this post. Please share your valuable feedback.
Pingback: The South Asia MVP Blog
One thing that i wants to ask is – what is generic methodology?
I mean could you please show / share the example or code that you were written in the past.
and what is the best place to write the code of – checks whether session is expired or not ??
Rather than repeat the code in each page, is it better to write the code in global.asax or in HTTPModule ??
I would be thankful, if u could help me out.
Sorry for replying late, seems missed your question. On internet search, you will get many ways to check the session expiration. There could be following ways
1 – Create a base page and all the page should inherit from this page. You can put all your common code in this page including session expiration check.
2 – You can have a check on the master page as well and use it on the every aspx page.
3 – Create a custom module that checks the session expiration. This can be reusable in other applications as well if flexible enough.
4- Last you can put the session expiration check on each page but I would not recommend it. Use this only if your application less number of pages like 1 or 2 page.
I used the first way in my early applications.