改变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;
}
{
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);
}
{
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);
}
{
if (randgen == null)
{
randgen = new RNGCryptoServiceProvider();
}
byte[] data = new byte[15];
randgen.GetBytes(data);
return Encode(data);
}