Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get Session to expire gracefully in ASP.NET

I need a way to tell ASP.NET "Kill the current session and start over with a brand new one" before/after a redirect to a page.

Here's what I'm trying to do:

1) Detect when a session is expired in the master page (or Global.asax) of an ASP.NET application.

2) If the session is expired, redirect the user to a page telling them that their session is expired. On this page, it will wait 5 seconds and then redirect the user to the main page of the application, or alternatively they can click a link to get there sooner if they wish.

3) User arrives at main page and begins to use the application again.

Ok, so far I have steps 1 and 2 covered. I have a function that detects session expiry by using the IsNewSession property and the ASP.NET Session ID cookie value. if it detects an expired session it redirects, waits five seconds and then TRIES to go to the main page.

The problem is that when it tries to redirect, it gets to the part in the master page to detect an expired session and it returns true. I've tried calling Session.Abandon(), Session.Clear(), even setting the session to NULL, with no luck.

Someone out there has had to have faced this problem before, so I'm confident in the community to have a good solution. Thanks in advance.

like image 427
Robert Iver Avatar asked Feb 03 '09 22:02

Robert Iver


2 Answers

The problem you are describing happens because asp.net is reusing the sessionid, if the sessionid still exists in the auth cookie when you call abandon() it will just reuse it, you need to explicitly create a new sessionid afaik something like:

 HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");
    mycookie.Expires = DateTime.Now.AddDays(-1);
    Response.Cookies.Add(mycookie);
like image 123
Element Avatar answered Oct 15 '22 16:10

Element


For ASP.NET MVC this is what I'm doing with an action method.

Note:

  • Returns a simple view with no other resources that might accidentally re-create a session
  • I return the current time and session id so you can verify the action completed succcessfully

    public ActionResult ExpireSession()
    {
        string sessionId = Session.SessionID;
        Session.Abandon();
        return new ContentResult()
        {
            Content = "Session '" + sessionId + "' abandoned at " + DateTime.Now
        };
    }
    
like image 45
Simon_Weaver Avatar answered Oct 15 '22 15:10

Simon_Weaver