asp.net 配置二级域名的共享session,并实现sso单点登录
公司最近做了一个新网站。原先网站的网址是www.xxxx.com。新做的网站要部署到info.xxxx.com。这两个网站要实现单点登录。而新老网站本身机构的原因,对于登录状态的判断,说白了就是对于session的判断。只要能让两个网站的session共享。那就可以实现单点登录了。由于我们公司的两个网站都是在一台服务器上的,所以要用这个方法,必须要满足三个条件
1. 两个网站同为二级域名
2. 两个网站部署在同一台服务器上。
3. session也保存在与网站同一台服务器上。
好了,直接讲方法,能实现才是硬道理,等实现后再去搞明白其中的原理,
操作步骤:
1. 在webconfig中,对session进行配置。在<configuration>中的<system.web>添加如下代码
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="" />
<machineKey validationKey="89K2J3HKSDIFY32BJF98SD98WIUHWI9823HQ21LSN0XMNV0NSFK3OIU0A9SU923NJ2J43O04123JLNKCM0VXLASLQPQP2O34098385HSFKJH23OB" decryptionKey="EERY7N4MVCLSP03384U547DAVZCZ4252617273GGGSHSJS8834320ORLKDMNVBBG" validation="SHA1" decryption="AES" />
</system.web>
这几行代码做两件事,1.将sessionstate的mode改为“StateServer”。2.设置加密和解密规则。
2. 打开本地服务--》找到“ASP.NET 状态服务”,默认是不启动的,我们这里要把它启动。原因是mode="StateServer"表示session将使用进程外 ASP.NET 状态服务来存储状态信息。这个就需要ASP.NET 状态服务的支持,所以必须要打开。如果是需要配置成使用远程服务器存储session,还需要修改注册表,去打开远程访问。这个方面内容自己可以网上百度,这里不赘述。
3.创建一个类。如果网站是部署在IIS7及以上的必须将这个类创建在app_code下。否则会报错。如果是IIS7以下不太清楚。我这里的网站是部署在IIS7上的。所以必须创建在app_code文件夹下
public class CookiesHttpModule : IHttpModule
{
#region IHttpModule 成员 void IHttpModule.Dispose()
{
//throw new Exception("The method or operation is not implemented.");
} void IHttpModule.Init(HttpApplication context)
{
context.EndRequest += new EventHandler(this.EndRequest);
} #endregion private void EndRequest(object sender, EventArgs args)
{
HttpApplication application = sender as HttpApplication;
for (int i = ; i < application.Response.Cookies.Count; i++)
{
if (application.Response.Cookies[i].Name == "ASP.NET_SessionId")
application.Response.Cookies[i].Domain = ".xxxx.com";
}
}
}
这个代码的含义是,把存放sessionid的cookies的domain,改成一级域名。如此一来就能共享存放sessionid的cookies了。
4. 在webconfig的configuration节点中,添加如下代码,作用是将这个每次在访问链接的时候,能使用到这个类。这个配置方式是iis7及以上的配置方式。如果网站是在iis6及以下的,可以在configuration下的system.web中的httpModules进行配置
<system.webServer>
<modules>
<add name="CookiesHttpModule" type="SSO2.App_Code.CookiesHttpModule,SSO2"/>
</modules>
</system.webServer>
5.也是最后一步了。在Global.asax中添加如下方法。
public override void Init()
{
base.Init();
foreach (string moduleName in this.Modules)
{
string appName = "APPNAME";
IHttpModule module = this.Modules[moduleName];
SessionStateModule ssm = module as SessionStateModule;
if (ssm != null)
{
FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic);
SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm);
if (store == null)//In IIS7 Integrated mode, module.Init() is called later
{
FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
appNameInfo.SetValue(theRuntime, appName);
}
else
{
Type storeType = store.GetType();
if (storeType.Name.Equals("OutOfProcSessionStateStore"))
{
FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
uribaseInfo.SetValue(storeType, appName);
}
}
}
}
}
在你需要的网站,中都加入上述代码,就可以实现两个相同一级域名的网站间共享session
PS:如果将sessionState mode 改为"StateServer"后,发现scriptmanager无效的话,可以将scriptmanager中的EnablePartialRendering属性改为"false"
参考文献:http://www.cnblogs.com/zhangzhixiong/p/5573525.html
asp.net 配置二级域名的共享session,并实现sso单点登录的更多相关文章
- ASP.NET二级域名站点共享Session状态
我的前面一篇文章提到了如何在使用了ASP.NET form authentication的二级站点之间共享登陆状态, http://www.cnblogs.com/jzywh/archive/2007 ...
- EF架构~二级域名中共享Session
回到目录 对于一个有点规模的网站,都会有各个子网站,说是子网站,其实也都是独立的站点,一般通过二次域名来分开,如www.zzl.com,它可以有很多子网站,如image.zzl.com,file.zz ...
- .net学习笔记----二级域名站点共享Session状态
前面一篇文章提到了如何在使用了ASP.NET form authentication的二级站点之间共享登陆状态, http://www.cnblogs.com/jzywh/archive/2007/0 ...
- 使用nginx配置二级域名
使用nginx配置二级域名 2018.11.21 11:51:17字数 613阅读 170 最近想把三个项目配在一个服务器上,于是想使用nginx配置二级域名实现. 1.域名添加解析 我的是阿里云的域 ...
- 利用nginx泛域名解析配置二级域名和多域名
利用nginx泛域名解析配置二级域名和多域名 网站的目录结构为 html ├── bbs └── www html为nginx的安装目录下默认的存放源代码的路径. bbs为论坛程序源代码路径 www为 ...
- 通过Nginx为网站配置二级域名
目录 配置域名解析 配置Nginx 重启Nginx 补充 需求:服务器上面运行多个项目:实现每个二级域名访问对应项目: 服务器:阿里云服务器:域名:阿里云注册: 配置域名解析 即配置DNS解析.一定要 ...
- sso单点登录系统(解决session共享)
场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...
- GitLab11.3.9 使用 Crowd3.3.2 的帐号实现 SSO 单点登录,以及GitLab配置腾讯企业邮箱
GitLab11.3.9 的安装方法: 点击查看. Crowd3.3.2 的安装方法:点击查看. 需要先在 Crowd 创建应用程序,参考 <Docker 创建 Crowd3.3.2 以 ...
- ASP.NET实现二级域名(多用户,多商店)
本人所了解有两种方案,可能还有其的方式,希望大家多多讨论! 基本思路: 1. 域名支持泛解析,即是指:把A记录 *.域名.com 解析到服务器IP,服务器IIS中做绑定,绑定时主机头为空; 2. ...
随机推荐
- Altium Designer PCB 常用功能键
altium designer 5种走线模式的切换 : shift+space 方格与格点的切换:View-Grids-ToggleVisible Grid Kind源点:Edit-Origin-Se ...
- home_work--用户登陆
前提: 根据文本中的已有用户和密码,实现登陆的交互:在用户输入用户名后,会有一个检测用户是否被锁定的环节:如果用户三次密码输入错误,则该用户则会被添加到锁定文件中,无法登陆. 涉及到的知识点: 1.p ...
- R 语言画图的基本参数
R 语言画图的基本参数 点 点的种类 点的种类参数为 pch,每一种符号对应一个数字编号 # 点有25种,为了展示25种点 x = 1:25 y = 1:25 x ## [1] 1 2 3 4 5 6 ...
- 【C++深入浅出】设计模式学习之单例模式
但凡成为大家公认的模式,都是有一些不可小觑的威力,今天分享一个简单的设计模式:单例模式. 单例模式用于一些只希望有一个实例的类或者只希望执行一次的操作:校长只能有一个.老板只能有一个.用户点击弹窗只希 ...
- Eclipse+Maven构建web项目及部署时Maven lib依赖问题的解决
目录 Eclipse中m2e插件构建web项目的步骤 Maven工具构建web项目再导入Eclipse的步骤 [一].Eclipse中m2e插件构建web项目的步骤 第一步:创建项目,按照 New – ...
- SCOM随笔
1.在监控群集资源时,安装完agent后,在代理管理-agent属性中选中“允许此代理充当代理并发现其他计算机上的托管对象” 如果监控DC的话,也要选中该选项
- 【转】placement new
原文:http://www.cnblogs.com/wanghetao/archive/2011/11/21/2257403.html 1. placement new的含义placement new ...
- 【20】宁以pass-by-reference-to-const替换pass-by-value
1.首先理解需求,被调用方法修改了形参,如果期望在主调方法中的实参也发生变化,必须使用pass-by-reference.因为C++缺省情况下(继承C方式),以by-value传递对象,在被调方法中修 ...
- Zmodem transfer canceled by remote side
linux sz命令时报这个错误,看了一头雾水. 仔细看了一下发现竟然是要sz的文件名称写错了,抱着个错误和误导人呢.估计路径写错了也是这个错误.
- (DP6.1.2.1)UVA 147 Dollars(子集和问题)
/* * UVA_147.cpp * * Created on: 2013年10月12日 * Author: Administrator */ #include <iostream> #i ...