用ILSpy查看Session.SessionID的生成算法
缘由
asp.net Session在InProc模式下,容易丢失,经常需要重新登录,且不支持分布式共享。
所以在研究Redis实现原生的Session,本来想用GUID作为key存入cookie,又在想能不能实现跟Session一样的id
实现
ILSpy 是一个开源的.NET反编译工具,简洁强大易用是它的特征。在绝大多数情况下,它都能很好的完成你对未知程序集内部代码的探索。
ILSpy 下载地址:点击下载
在VS中可以得知SessionID是System.Web.SessionState命名空间的HttpSessionState类下的属性。
在ILSpy中搜索HttpSessionState,找到Session属性,是IHttpSessionState接口对象创建的。

查看HttpSessionState的构造函数,原来IHttpSessionState是从构造函数传过来的。

本来是想通过搜索构造函数找到是哪传过来这个对象的,只是ILSpy只提供类型,成员,常量的搜索
折腾了好久,终于找到IHttpSessionState的接口实现类HttpSessionStateContainer

DelayedGetSessionId方法

CreateSessionId方法

在追踪CreateSessionID方法,是个接口中定义的方法

搜索CreateSessionID方法,找到具体的现实


最后找到Create方法的所在类

测试
具体的代码:
internal static class SessionId
{
internal const int NUM_CHARS_IN_ENCODING = ;
internal const int ENCODING_BITS_PER_CHAR = ;
internal const int ID_LENGTH_BITS = ;
internal const int ID_LENGTH_BYTES = ;
internal const int ID_LENGTH_CHARS = ;
private static char[] s_encoding;
private static bool[] s_legalchars;
internal static bool IsLegit(string s)
{
if (s == null || s.Length != )
{
return false;
}
bool result;
try
{
int num = ;
while (--num >= )
{
char c = s[num];
if (!SessionId.s_legalchars[(int)c])
{
result = false;
return result;
}
}
result = true;
}
catch (IndexOutOfRangeException)
{
result = false;
}
return result;
}
internal static string Create(ref RandomNumberGenerator randgen)
{
if (randgen == null)
{
randgen = new RNGCryptoServiceProvider();
}
byte[] array = new byte[];
randgen.GetBytes(array);
return SessionId.Encode(array);
}
static SessionId()
{
SessionId.s_encoding = new char[]
{
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
'',
'',
'',
'',
'',
''
};
SessionId.s_legalchars = new bool[];
for (int i = SessionId.s_encoding.Length - ; i >= ; i--)
{
char c = SessionId.s_encoding[i];
SessionId.s_legalchars[(int)c] = true;
}
}
private static string Encode(byte[] buffer)
{
char[] array = new char[];
int num = ;
for (int i = ; i < ; i += )
{
int num2 = (int)buffer[i] | (int)buffer[i + ] << | (int)buffer[i + ] << | (int)buffer[i + ] << ;
int num3 = num2 & ;
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num2 = ((num2 >> & ) | (int)buffer[i + ] << );
num3 = (num2 & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
}
return new string(array);
}
}
调用:
public partial class Contact : Page
{ protected void Page_Load(object sender, EventArgs e)
{
string SessionId = CreateSessionID(Context);
Response.Write(SessionId+"<br/>");
Response.Write(Session.SessionID);
Response.End();
} private RandomNumberGenerator _randgen;
public virtual string CreateSessionID(HttpContext context)
{ return SessionId.Create(ref this._randgen);
} }
效果截图:

用ILSpy查看Session.SessionID的生成算法的更多相关文章
- cookie,session,sessionid
cookie,session,sessionid http协议是无状态的,意思是每次请求的状态不会保存.因此,产生了cookie,session之类保存会话状态的机制.1.什么是cookiecooki ...
- STL_算法_04_算术和生成算法
◆ 常用的算术和生成算法: 1.1.求和( accumulate 是求和的意思)(对指定范围内的元素求和,然后结果再加上一个由val指定的初始值.) T accumulate(iteratorBegi ...
- roguelike地牢生成算法
文章原地址 上一个地图生成算法,这一次是一个地牢的生成算法,是一个国外的人写的算法,用dart语言写,我把它改成了unity-c#. 原作者博客地址:Rooms and Mazes: A Proced ...
- 美团技术分享:深度解密美团的分布式ID生成算法
本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...
- HttpContext.Current.Session.SessionID相关问题及备忘
今天Tony提到说我们系统中会利用如下代码来判断用户是否过期. if (string.IsNullOrEmpty(UserContext.ConnectionSessionId)) { LogUIFa ...
- 一个UUID生成算法的C语言实现 --- WIN32版本 .
一个UUID生成算法的C语言实现——WIN32版本 cheungmine 2007-9-16 根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...
- 分布式全局不重复ID生成算法
分布式全局不重复ID生成算法 算法全局id唯一id 在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高 ...
- C++ 基于凸包的Delaunay三角网生成算法
Delaunay三角网,写了用半天,调试BUG用了2天……醉了. 基本思路比较简单,但效率并不是很快. 1. 先生成一个凸包: 2. 只考虑凸包上的点,将凸包环切,生成一个三角网,暂时不考虑Delau ...
- C++ 凸包生成算法
由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...
随机推荐
- 引用js或css后加?v= 版本号的用法
<span style="font-size:14px;">css和js带参数(形如.css?v=与.js?v= 或 .css?version=与.js?version ...
- bootstrap学习笔记--bootstrap排版类的使用
标题 Bootstrap 中定义了所有的 HTML 标题(h1 到 h6)的样式,这个和一般的html没啥区别.请看下面的实例: <h1>测试1 h1</h1> <h2& ...
- boostrap 模态框
<div class="modal fade" id="myModal" tabindex="-1" role="dialo ...
- RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...
- shell脚本学习第一课
shell是一种程序设计语言,是访问操作系统内核的服务. Linux的shell种类常见的有: Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell ...
- DNA解链统计物理
来源:Kerson Huang, Lectures on Statistical Physics and Protein Folding, pp 24-25 把双链DNA解开就像拉拉链.设DNA有\( ...
- solr 安装
1:solr简介 solr是一个开源的搜索引擎,是对lucene做了封装,对外提供类似于webservice接口, 可以使用http请求的方式对solr进行操作. lucene.solr.elasti ...
- 【Python文件处理】递归批处理文件夹子目录内所有txt数据
因为有个需求,需要处理文件夹内所有txt文件,将txt里面的数据筛选,重新存储. 虽然手工可以做,但想到了python一直主张的是自动化测试,就想试着写一个自动化处理数据的程序. 一.分析数据格式 需 ...
- centos 编程环境
1,老毛桃/大白菜, iso制作将镜像文件写入u盘2, 安装,修改安装源路径 (手动修改为你的u盘dev)一般为sdb43, 安装时选择桌面安装 4, 更改安装源cd /etc/yum.repos ...
- 让IE8支持placeholder
$(function(){ if(!placeholderSupport()){ // 判断浏览器是否支持 placeholder $('[placeholder]').focus(function( ...