ASP.NET在不同应用程序之间共享Session

  最近在做一个多模块的大型项目,其中有些模块由其他公司承包,环境是.NET2.0。我的设计方案是每个模块是一个单独的应用程序,那么问题是如何将这些模块集中身份验证与授权过程呢?是个问题。。

  我尝试将每个独立的Web应用程序放到统一的解决方案中,然后尝试编译,失败..

  接着我想到了.NET环境下Session管理的3种方式——进内内、进程外、数据库

  首先来看默认的InProc模式,Session被存储在IIS进程中,每个虚拟目录是隔离的,所以无法共享Session

  然后是传说中的State Server, 虽然是独立的状态服务器(进程),但在内存中这些应用程序还是隔离的,我要想让他们实现共享,就需要修改内存?难度太大了..放弃

  接下来是第三种方式,数据库服务器。由于对Session的全部操作都是由存储过程来实现的,而且存储过程未进行加密,所以我就设想通过修改存储过程的内部结构来达到共享的目的

  用“aspnet_regsql.exe -S 127.0.0.1 -E -ssadd ”创建ASPState数据库和相应对象

  然后我们看tempdb数据库中多了两个用户表,ASPStateTempSessions和ASPStateTempApplications

  ASPStateTempApplications表中存储的是应用程序信息,每个应用程序在启动的时候在这里会注册一条记录,包括应用程序的ID(通过哈希算法生成的)和应用程序名称。这样思路就出来了,有多少个应用程序,在这个表里就对应多少条记录。那我们现在要做的是把这些记录变成一条记录,也就是要欺骗Framework,让它认为这些不同的应用程序是同一个应用程序.

  于是我找到了TempGetAppID存储过程,这个存储过程是用于通过传递应用程序名称来得到应用程序ID信息的。根据我的推断,每个应用程序在调用这个过程时,这个过程会去AspStateTempApplications中检查是否有相应的记录,如果没有,就插入记录,然后返回相应的ID

  这个存储过程原来的结构是这样的:
+展开
-SQL
--===========================
    ALTER PROCEDURE [dbo].[TempGetAppID]
    @appName    tAppName,
    @appId      int OUTPUT
    AS
    SET @appName = LOWER(@appName)
    SET @appId = NULL

    SELECT @appId = AppId
    FROM [tempdb].dbo.ASPStateTempApplications
    WHERE AppName = @appName
    ....
-- ===========================


我们来把它改成:
+展开
-SQL
--===========================
    ALTER PROCEDURE [dbo].[TempGetAppID]
    @appName    tAppName,
    @appId      int OUTPUT
    AS
    SET @appName = LOWER(@appName)
    SET @appName = ‘/lm/w3svc/650056020/root/personnel/share’
    SET @appId = NULL

    SELECT @appId = AppId
    FROM [tempdb].dbo.ASPStateTempApplications
    WHERE AppName = @appName
--===========================


  我加了一句“SET @appName = /lm/w3svc/650056020/root/personnel/share”,也就是说,不管传递的是什么名字,我都把它变成统一的名字..然后F5一下就ok了,我的网站是www.91jn.com,欢迎各位交流!!

来源:http://www.cnwebmasters.com/thread-14360-1-1.html

加支付宝好友偷能量挖...


评论(0)网络
阅读(168)喜欢(0)Asp.Net/C#/WCF