多个asp.net程序共用Session(sso程序的外设接口)

 

最近一段时间,又有客户要做sso单点登录。

我以前设计了专门用于点击登录的页面,web.config里面放置可修改的,验证中心的地址。这样如果很多客户都用同一种单点登录请求方式的时候,不同的客户仅仅修改web.config里面的验证中心的地址就可以了。

但是计划永远也赶不上变化。用户的需求永远是多样的,导致程序不能满足需求,这样就得不断的为每个客户不能得sso接口,来修改程序。

于是,我想如果现在的程序不变,单独写一个sso单点登录页面。可这样我遇到了一个问题,就是如果部署2个虚拟目录(或网站)的话,就遇到了session的跨web的情况了。

在网上看到下面这篇文章:


前 一段时间被同一个站点的不同Web项目通用Session的问题苦恼,搞得我很不爽,好多天都在想这个问题,在朋友的帮助下,找到了解决方法,网上也看了 一些相关文章。不过这些文章描述的并不够详细,我把这些相关知识整理一下,方便自己以后查找,也方便以后碰到这样问题的人,不要到处找资料,拼凑资料。

首先说明几点:
1、不同站点或虚拟目录是不能共享Session的
2、VS.NET默认创建的Web工程是一个工程一个虚拟目录
3、多个工程最好只能有一套的Web.config和Global.asax
由于以上的原因我们用手动创建多个工程的时候就不能共享Session,但使用VS.NET中的创建->其它项目->企业级模板项目就不会出现这样的问题了。

解决这个问题并不难,注意两点就行了:
1、多个工程最好只能有一套的Web.config和Global.asax
把 这些工程合并到一个虚拟目录下,至于Web.config和Global.asax,虽然一个工程可以配置一个,但是推荐还是整个web站点用一套配置, 而且不同目录下的Web.config影响不同的目录下aspx的配置,如果根目录下和一个WEB应用程序目录下都有Web.config文件,而且都定 义了,sessionState mode="InProc" 显然这两个应用的Session不可能共享了。
2、多个虚拟目录合并,或只用一个站点,就可以了。
具体做法是,在IIS设置里 打开子工程的目录 查看属性->目录->应用程序设置 中有个删除按钮,点那个删除就会把这个目录的虚拟目录去除,这样就OK了。

我遇到的问题就是没有注意到第二点。
我的做法是:
在 资源管理器中工程目录点右键->共享->Web共享->然后指定一个名称,然后就用VS.NET打开就可以打开了,但就是不能共享 Session。没有注意到IIS把里面的子工程也设为了虚拟目录。原来打开的时候VS.NET会把另一个工程也设置 为一个虚拟目录,所以Session就不能共享了。我唯一做的就是把那个虚拟目录删除就行了。就这么一个小问题搞的我好多天都没有睡好觉。希望大家不要学 我哟


这里我们把原来的程序称为A程序,新建的这个程序为B程序。

我新建了一个web工程,(由于测试所以未调用验证中心)。

其功能为:建立用户session,并跳转的 A程序的管理后台。


我把B程序里面的页面放到相应的A程序下。B程序生成的dll文件,放A程序的bin目录下。

(说白了,就是把B程序拷贝到A程序里面,但不替换原来的web.config、Global.asax等)

注意:这样处理后,B程序调用的web.config就和A程序调用的web.config是同样的一个了。大家在设计B程序的时候,一点要注意。

到iis里面我们测试一下吧,直接浏览B程序里面的页面,我们看到直接进入到A程序的后台管理了。跳过了A程序的登录页面。

成功。

 

posted on 2010-03-31 18:35  代码泪  阅读(1793)  评论(0编辑  收藏  举报

导航