报表修改和共享Session
代码
http://www.cnblogs.com/gaoweipeng/archive/2009/10/02/1577351.html
Reprot Service 的报表经验
1 如果需要更换密码时, 要在报表后台Pager/Pager.aspx页面将管理员角色赋予新增的用户,同时在IIS中的Report Service中的权限选项也必须赋予新增用户
2 如果在找开报表时遇到没有认证的问题, 在“开始”-“SQL 配置”将数据库初始化选项中输入相应的数据库用户名和密码
在报表迁移时,需要增加的两张表 RolePopele, HelpCenter,还有记得在RolePopele中增加一个10000的行
调试时用的宿主文件。程序最终运行的时候没有这个,用于提供调试环境的,也可以不要这个。在工程的属性里去掉就可以了。
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
这个存储过程原来的结构是这样的:
===========================
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
....
===========================
我们来把它改成:
===========================
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.cnblogs.com/gaoweipeng/archive/2009/10/02/1577351.html
Reprot Service 的报表经验
1 如果需要更换密码时, 要在报表后台Pager/Pager.aspx页面将管理员角色赋予新增的用户,同时在IIS中的Report Service中的权限选项也必须赋予新增用户
2 如果在找开报表时遇到没有认证的问题, 在“开始”-“SQL 配置”将数据库初始化选项中输入相应的数据库用户名和密码
在报表迁移时,需要增加的两张表 RolePopele, HelpCenter,还有记得在RolePopele中增加一个10000的行
调试时用的宿主文件。程序最终运行的时候没有这个,用于提供调试环境的,也可以不要这个。在工程的属性里去掉就可以了。
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
这个存储过程原来的结构是这样的:
===========================
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
....
===========================
我们来把它改成:
===========================
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,欢迎各位交流!!