改变ASP.NET_SessionId值

通过改变ASP.NET_SessionId的值,来获取ASP.NET_SessionId对应所存储的Session值。

1)因为Session的初始化是在AcquireRequestState事件,所以必须在调用AcquireRequestState事件之前对ASP.NET_SessionId的值进行修改。

2)ASP.NET_SessionId的值进行修改后,必须把修改后的值,返回到客户端,进行客户端的cookie值修改。

     1.ASP.NET_SessionId的值,必须要符合其规则,不然的话,系统会默认生成一个新的。若修改的ASP.NET_SessionId是在另外一个域下,规则不符合,系统会生成一个新的

ASP.NET_SessionId值,赋予此域下的ASP.NET_SessionId,并未其对应的域下生成一个新的ASP.NET_SessionId。
     2.当然,前面第一点提到的是,在系统内部赋予response值前进行修改response值的情况。若在系统内部赋予response值之后进行修改,就不会受此影响。

 

SessionID的生成过程

首先SessionID是在SessionStateModule里生成的,是在AcquireRequestState事件里生成的,调用的方法是:

 

 internal bool CreateSessionId()
    {
        bool flag;
        this._rqId = this._idManager.CreateSessionID(this._rqContext);
        this._idManager.SaveSessionID(this._rqContext, this._rqId, out flag, out this._rqAddedCookie);
        return flag;
    }

 通过上面我们可以看到,this._rqId就是生成的SessionID,调用的方法是SessionIDManger的实例的CreateSessionID方法,调用方法如下:

 

public virtual string CreateSessionID(HttpContext context)
    {
        return SessionId.Create(ref this._randgen);
    }

从上面的代码我们可以看到,其调用的是SeesionId类的静态方法Create,参数为ref类型,所以通过思考,SessionID的有效期就是SessionIDManger的实例的生命周期。方法如下:

internal static string Create(ref RandomNumberGenerator randgen)
    {
        if (randgen == null)
        {
            randgen = new RNGCryptoServiceProvider();
        }
        byte[] data = new byte[15];
        randgen.GetBytes(data);
        return Encode(data);
    }
 

 

posted on 2011-12-16 19:14  啊T  阅读(6013)  评论(0编辑  收藏  举报