Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In ASP.NET (server side), how can I uniquely identify one browser window from another which are under the same cookiedbased sessionId

The users of my web application may have more than one browser window (or tab) open and pointed to the same page. We're using cookie based session id's, and the user will usually work within the same session id in both browsers/tabs. I would like to be able to uniquely identify which browser window (and tab) that requested an ASP.NET page (in order to make sure, that data stored in the session does not get mixed up).

(e.g. I would be happy if the browser would generate and send a window/tab-id with the http request, as it publishes HTTP_USER_AGENT)

Any ideas?

--thomas

like image 290
thomas a. h. Avatar asked Jan 29 '10 13:01

thomas a. h.


4 Answers

If I was going to implement something like this I would probably start with a Dictionary<Type, List<Guid>> and store this in the users session. I would also probably make this be a custom type that delegates the dictionary and have a factory method that works similar to

public Guid GeneratePageIdentifier(Page thepage)
{
    var guid = Guid.New();

    if(_dictionary[thepage.GetType()] == null)
        _dictionary[thepage.GetType()] = new List<Guid> { guid };
    else
        ((List<Guid>)_dictionary[thepage.GetType()]).Add(guid);

    return guid;

}

Then embed the guid that's returned from that method on the VIewState of the page. On your page methods that execute actions that you need to validate which page it is you would be able to validate that guid is inside the collection do something. You might also want to implement a custom a type with a guid property to enscapulate more information about why you're doing this or what you need for it to be meaningful.

like image 123
Chris Marisic Avatar answered Nov 05 '22 09:11

Chris Marisic


The Viewstate on each page will be different, maybe you can use some kind of unique identifier created on every page loaded?

like image 32
Mark Redman Avatar answered Nov 05 '22 07:11

Mark Redman


It is by default not possible due to the stateless nature of the web, but you could add a "page identifier" that gets generated with each opened page and transmitted for every action.

I'd recommend that you refactor the application in a way that those mixups can't happen, no matter from which page/tab/window the request originates.

like image 26
Morfildur Avatar answered Nov 05 '22 07:11

Morfildur


As Mark Redman said, you can use Viewstate + Session in order to store values specific to the page. ViewState is good for storing the key (string), Session for storing whatever type of complex objects.

Use the ViewState or a hidden field in order to load at the first call a GUID.

   public string PageUid
   {
       get
       {
           if (ViewState["UID"] == null)
               ViewState.Add("UID", Guid.NewGuid().ToString());

           return ViewState["UID"].ToString();
       }
   }

Then use the session to get/set your values using this key:

   string MyPagesessionVariable
   {
       get
       {
           if (Session["MYVAR" + PageUid] == null)
           {
               Session["MYVAR" + PageUid] = "VALUE NOT SHARED WITH OTHER TABS/WINDOWS";
           }

           return Session["MYVAR" + PageUid];
       }

       set
       {
           Session["MYVAR" + PageUid] = value;
       }
   }
like image 31
Matteo Conta Avatar answered Nov 05 '22 07:11

Matteo Conta