All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
如何使用SQL Server数据库查询累计值_[SQL Server教程]
如何建立自己的新闻发布系统?_.net资料_编程技术
SQL Server数据库的安全性控制策略_[SQL Server教程]
asp.net判断页面加载所用时间_[Asp.Net教程]
XML学习起步_[XML教程]
解析在ASP.NET中调用存储过程的方法_[Asp.Net教程]
C#中GroupBox控件应用实例
实例:用Visual,C#制作新闻阅读器_.net资料_编程技术
sql2000挂起无法安装的问题_[SQL,Server教程]
php获取某个目录大小_[PHP教程]
Reading number is top 10 pictures
A man's favorite things1
美丽的少女1
NeedWallpaper1
Summer is most suitable for young people to travel in China3
西班牙山村小景5
So beauty, will let you spray blood10
Kim jong il's mistress, national beauty JinYuJi actor1
Extremely rare TianShan Mountains snow lotus1
Poor doll, hand job was caught the currently in effect by his dad
Summer is most suitable for young people to travel in China1
Download software ranking
Unix video tutorial2
塘西风月痕
Eclipse 4.2.2 For Win64
Unix video tutorial6
Unix video tutorial4
Unix video tutorial7
Ashlynn Video2
Unix video tutorial5
asp.net技术内幕
Ashlynn Video1
aaa published in(发表于) 2013/12/17 7:45:27 Edit(编辑)
ASP.NET,1.1,无,Cookie,SessionID,重写_.net资料_编程技术

ASP.NET,1.1,无,Cookie,SessionID,重写_.net资料_编程技术

ASP.NET 1.1 无 Cookie SessionID 重写_.net资料_编程技术-你的首页-uuhomepage.com

  浏览器的会话使用存储在 SessionID 属性中的唯一标识符进行标识。会话 ID 使 ASP.NET 应用程序能够将特定的浏览器与 Web 服务器上相关的会话数据和信息相关联。会话 ID 的值在浏览器和 Web 服务器间通过 Cookie 进行传输,如果指定了无 Cookie 会话,则通过 URL 进行传输。


  ASP.NET 通过自动在页的 URL 中插入唯一的会话 ID 来保持无 Cookie 会话状态。例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的会话 ID lit3py55t21z5v55vlm25s55:


  http://www.example.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx


  如果一个包含无 Cookie SessionID 的链接被多个浏览器共享时(可能通过搜索引擎或其他程序),此行为可能导致对会话数据的意外共享。可以通过禁用会话标识符的回收来降低多个客户端共享会话数据的可能性。为此,将 sessionState 配置元素的 regenerateExpiredSessionId 属性设置为 true。这样,在使用已过期的会话 ID 发起无 Cookie 会话请求时,将生成一个新的会话 ID。
——摘自 MSDN


  .NET2.0中我们已可以通过重写SessionIDManager 类来改变SessionID 的生成机制和验证方法来防止会话数据的意外共享(即出现多个浏览器被识别为同一个会话,共用一个Session),可在.NET1.1中却没有相关的类让我们改变SessionID 的生成机制(封装死了),但受一篇文章的启发,我们可以在SessionID 生成之后对它进行处理。文章是老外写的,由于本人阅读能力有限,偶可没时间去看一大版唧唧歪歪的鹰文,直接下了代码来看。还好代码不算多,思路也很清晰,大概了解了他实现重写SessionID的原理,我改了下在无Cookie 会话中完美实现了。


相关代码


using System;
using System.Web;
using System.Web.SessionState;
using System.Web.Security;
using System.Configuration;
using System.Security.Cryptography;
using System.Runtime.Serialization;
using System.Globalization;
using System.Text;


public class SecureSessionModule : IHttpModule
{
private static string _ValidationKey = null;


public void Init (HttpApplication app)
{
if (_ValidationKey == null)
_ValidationKey = GetValidationKey ();
app.AcquireRequestState+=new EventHandler(app_AcquireRequestState);
}


void app_AcquireRequestState (Object sender, EventArgs e)
{
_ValidationKey=GetValidationKey();//每天生成一个KEY提高安全性


HttpContext current = ((HttpApplication) sender).Context;


//将处理后的SessionID存在Session["ASP.NET_SessionID"]中
string sessionid = GetSession (current, "ASP.NET_SessionID");


if (sessionid != null)
{
if (sessionid.Length <= 24)
RedirectUrl(current);


string id = sessionid.Substring (0, 24);
string mac1 = sessionid.Substring (24);


string mac2 = GetSessionIDMac (id, current.Request.UserHostAddress, current.Request.UserAgent, _ValidationKey);


// 用户客户端信息发生的变化,比对失败
if (String.CompareOrdinal(mac1, mac2) != 0)
{
RedirectUrl(current);
}
}
else
{
RedirectUrl(current);
}
}


private void RedirectUrl(HttpContext current)
{
//重定向页面以重新生成新的SessionID
current.Response.Redirect(current.Request.Url.ToString(),true);
}


private string GetValidationKey ()
{
string key = DateTime.Now.ToShortDateString();


return key;
}


private string GetSession (HttpContext current, string name)
{
object id = FindSession(current.Session,name);
if (id == null)
{
// 将用户客户端信息加密存储在Session中以便比对
id= current.Session.SessionID+GetSessionIDMac (current.Session.SessionID, current.Request.UserHostAddress,
current.Request.UserAgent, _ValidationKey);
current.Session[name] = id;
}
return id.ToString();
}


private object FindSession (HttpSessionState session, string name)
{
return session[name];
}


private string GetSessionIDMac (string id, string ip, string agent, string key)
{
StringBuilder builder = new StringBuilder (id, 512);
builder.Append (ip);
builder.Append (agent);


using (HMACSHA1 hmac = new HMACSHA1 (Encoding.UTF8.GetBytes (key)))
{
return Convert.ToBase64String (hmac.ComputeHash (
Encoding.UTF8.GetBytes (builder.ToString ())));
}
}
public void Dispose () {}
}


相关配置如下:









  大家看了代码后就会知道,它实现的原理主要是因为不可能有相同IP电脑客户端同时访问一台服务器,当出现SessionID相同但他们客户端信息不同时就自动将后一个访问的客户端重定向以新建一个会话。

  遗憾的是在WAP上应用时就有问题了,由于客户端信息没IP唯一标识(移动不给手机号信息了),所以如果相同型号的手机访问时就无法区分,不知哪位高人有没更好的解决办法,还望不吝赐教





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.