利用Cookies实现ASP.NET跨域单点登录
在一开始学习用ASP.NET来做登录的时候,都是用Session来做登录凭证的,但是由于后期网站的功能越来越多就想把网站的功能细分,而做成像CSDN一样各个网站子分类都有一个自己的域名如news.mysite.com, blog.mysite.com;但问题来了因为Session不能跨应用程序,然后在网站搜索,但找到的都是把子网站合并到主网站去,显示这种做法是极其不合理的;
然后以下是我的想法
不用Session做登录凭证而用Cookies来做登录凭证
1:然后在IIS中建立两个网站News.MySite.com,Blog.MySite.com (注这些在要Hosts文件中进行转向,具体见面本文结尾),注意一定要有域名的网站不然的话如网站主机头为127.0.0.1或者localhost这样的主机头没有办法保存域Cookies(Cookies跨域:正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。)
2:在两个网站的Web.config中添加appsetting
<add key="RootDomain" value="mysite.com"/>
<add key="PrivateKey" value="12345678"/>
</appSettings>
这是为了方便网站以后换域名的时候不用更改代码,PrivateKey是防止篡改Cookies而效仿网银功能添加多一个MD5验证功能
3:编写Cookies操作类
001
|
using System;
|
002
|
using System.Web;
|
003
|
|
004
|
namespace Z.Core.Tools
|
005
|
{
|
006
|
/// <summary>
|
007
|
/// Cookie 操作类
|
008
|
/// </summary>
|
009
|
public class Cookie
|
010
|
{
|
011
|
/// <summary>
|
012
|
/// 设置一个Cookie
|
013
|
/// </summary>
|
014
|
/// <param name="name">名称</param>
|
015
|
/// <param name="value">值</param>
|
016
|
public static void Set( string name, string value)
|
017
|
{
|
018
|
Set(name, value, 0);
|
019
|
}
|
020
|
|
021
|
/// <summary>
|
022
|
/// 设置一个Cookie
|
023
|
/// </summary>
|
024
|
/// <param name="name">名称</param>
|
025
|
/// <param name="value">值</param>
|
026
|
/// <param name="expiresDays">过期时间</param>
|
027
|
public static void Set( string name, string value, int expiresDays)
|
028
|
{
|
029
|
//删除原先添加的相同Cookie
|
030
|
foreach ( string item in HttpContext.Current.Response.Cookies.AllKeys)
|
031
|
{
|
032
|
//判断为和当前已有的Cookie相同的时候进行remove
|
033
|
if (item == name)
|
034
|
{
|
035
|
HttpContext.Current.Response.Cookies.Remove(name);
|
036
|
}
|
037
|
}
|
038
|
HttpCookie MyCookie = new HttpCookie(name);
|
039
|
if (System.Configuration.ConfigurationManager.AppSettings[ "RootDomain" ] == null )
|
040
|
{
|
041
|
throw new Exception(Lang.Define.Get(Lang.DefineEnum.RootDomain_未设置));
|
042
|
}
|
043
|
MyCookie.Domain = System.Configuration.ConfigurationManager.AppSettings[ "RootDomain" ];
|
044
|
if (value != null )
|
045
|
{
|
046
|
MyCookie.Value = System.Web.HttpUtility.UrlEncode(value).Replace( "+" , "%20" );
|
047
|
}
|
048
|
//如果值为null的话说明删除这个cookie
|
049
|
if (value == null && expiresDays == 0)
|
050
|
{
|
051
|
expiresDays = -1;
|
052
|
}
|
053
|
if (expiresDays != 0)
|
054
|
{
|
055
|
DateTime expires = DateTime.Now.AddDays(expiresDays);
|
056
|
MyCookie.Expires = expires;
|
057
|
}
|
058
|
HttpContext.Current.Response.Cookies.Add(MyCookie);
|
059
|
}
|
060
|
|
061
|
/// <summary>
|
062
|
/// 删除一个Cookie
|
063
|
/// </summary>
|
064
|
/// <param name="name">名称</param>
|
065
|
public static void Delele( string name)
|
066
|
{
|
067
|
Set(name, "" , -1);
|
068
|
}
|
069
|
|
070
|
/// <summary>
|
071
|
/// 取得一个有效的Cookie
|
072
|
/// </summary>
|
073
|
/// <param name="name">名称</param>
|
074
|
/// <returns>值</returns>
|
075
|
public static string Get( string name)
|
076
|
{
|
077
|
string result = null ;
|
078
|
foreach ( string item in HttpContext.Current.Response.Cookies.AllKeys)
|
079
|
{
|
080
|
if (item == name)
|
081
|
{
|
082
|
if (HttpContext.Current.Response.Cookies[name].Expires > DateTime.Now || HttpContext.Current.Response.Cookies[name].Expires == new DateTime(1, 1, 1))
|
083
|
{
|
084
|
//如果判断到这个Cookie是有效的,取这个有效的新值
|
085
|
result = System.Web.HttpUtility.UrlDecode(HttpContext.Current.Response.Cookies[name].Value);
|
086
|
return result;
|
087
|
}
|
088
|
else
|
089
|
{
|
090
|
//无效的话还回null
|
091
|
return null ;
|
092
|
}
|
093
|
}
|
094
|
}
|
095
|
//如果在新添加中的没有就取客户端的
|
096
|
if (HttpContext.Current.Request.Cookies[name] != null )
|
097
|
{
|
098
|
result = System.Web.HttpUtility.UrlDecode(HttpContext.Current.Request.Cookies[name].Value.Replace( "%20" , "+" ));
|
099
|
}
|
100
|
return result;
|
101
|
}
|
102
|
|
103
|
/// <summary>
|
104
|
/// 清空Cookie
|
105
|
/// </summary>
|
106
|
public static void Clear()
|
107
|
{
|
108
|
for ( int i = 0; i <= HttpContext.Current.Request.Cookies.Count - 1; i++)
|
109
|
{
|
110
|
//当Cookies的名称不为ASP.NET_SessionID的时候将他删除,因为删除了这个Cookies的话会导致重创建Session链接
|
111
|
if (HttpContext.Current.Request.Cookies[i].Name.ToLower() != "asp.net_sessionid" )
|
112
|
{
|
113
|
Set(HttpContext.Current.Request.Cookies[i].Name, "" , -1);
|
114
|
}
|
115
|
}
|
116
|
}
|
117
|
}
|
118
|
}
|
4:编写登录凭证类
001
|
using System;
|
002
|
using System.Collections.Generic;
|
003
|
using System.Linq;
|
004
|
using System.Text;
|
005
|
|
006
|
namespace Z.Core.Tools
|
007
|
{
|
008
|
/// <summary>
|
009
|
/// 网站Cookie集合
|
010
|
/// </summary>
|
011
|
public class CookieGroupTemplate
|
012
|
{
|
013
|
/// <summary>
|
014
|
/// 登录User
|
015
|
/// </summary>
|
016
|
public static string UserCode
|
017
|
{
|
018
|
get
|
019
|
{
|
020
|
CheckKey();
|
021
|
return Z.Core.Tools.Cookie.Get( "UserCode" );
|
022
|
}
|
023
|
set
|
024
|
{
|
025
|
Z.Core.Tools.Cookie.Set( "UserCode" , value);
|
026
|
SetKey();
|
027
|
}
|
028
|
}
|
029
|
|
030
|
/// <summary>
|
031
|
/// 登录用户名
|
032
|
/// </summary>
|
033
|
public static string UserName
|
034
|
{
|
035
|
get
|
036
|
{
|
037
|
CheckKey();
|
038
|
return Z.Core.Tools.Cookie.Get( "UserName" );
|
039
|
}
|
040
|
set
|
041
|
{
|
042
|
Z.Core.Tools.Cookie.Set( "UserName" , value);
|
043
|
SetKey();
|
044
|
}
|
045
|
}
|
046
|
|
047
|
/// <summary>
|
048
|
/// 登录用户父级代码
|
049
|
/// </summary>
|
050
|
public static string ParentCode
|
051
|
{
|
052
|
get
|
053
|
{
|
054
|
CheckKey();
|
055
|
return Z.Core.Tools.Cookie.Get( "ParentCode" ); ;
|
056
|
}
|
057
|
set
|
058
|
{
|
059
|
Z.Core.Tools.Cookie.Set( "ParentCode" , value);
|
060
|
SetKey();
|
061
|
}
|
062
|
}
|
063
|
|
064
|
/// <summary>
|
065
|
/// 登录用户父级名称
|
066
|
/// </summary>
|
067
|
public static string ParentName
|
068
|
{
|
069
|
get
|
070
|
{
|
071
|
CheckKey();
|
072
|
return Z.Core.Tools.Cookie.Get( "ParentName" );
|
073
|
}
|
074
|
set
|
075
|
{
|
076
|
Z.Core.Tools.Cookie.Set( "ParentName" , value);
|
077
|
SetKey();
|
078
|
}
|
079
|
}
|
080
|
|
081
|
/// <summary>
|
082
|
/// 登录权限组
|
083
|
/// </summary>
|
084
|
public static string Groups
|
085
|
{
|
086
|
get
|
087
|
{
|
088
|
CheckKey();
|
089
|
return Z.Core.Tools.Cookie.Get( "Groups" ); ;
|
090
|
}
|
091
|
set
|
092
|
{
|
093
|
Z.Core.Tools.Cookie.Set( "Groups" , value);
|
094
|
SetKey();
|
095
|
}
|
096
|
}
|
097
|
|
098
|
/// <summary>
|
099
|
/// 操作位置
|
100
|
/// </summary>
|
101
|
public static string OperateFrom
|
102
|
{
|
103
|
get
|
104
|
{
|
105
|
return Z.Core.Tools.Cookie.Get( "OperateFrom" );
|
106
|
}
|
107
|
set
|
108
|
{
|
109
|
Z.Core.Tools.Cookie.Set( "OperateFrom" , value);
|
110
|
}
|
111
|
}
|
112
|
|
113
|
/// <summary>
|
114
|
/// 加密Cookies定义
|
115
|
/// </summary>
|
116
|
static List< string > CookieKeys = new List< string >()
|
117
|
{
|
118
|
"UserCode" , "UserName" , "ParentCode" , "ParentName" , "Groups" , "OperateFrom"
|
119
|
};
|
120
|
|
121
|
/// <summary>
|
122
|
/// 生成验证Key
|
123
|
/// </summary>
|
124
|
static void SetKey()
|
125
|
{
|
126
|
string key = "" ;
|
127
|
foreach (var s in CookieKeys)
|
128
|
{
|
129
|
key += s;
|
130
|
key += "=" ;
|
131
|
key += Cookie.Get(s);
|
132
|
key += "&" ;
|
133
|
}
|
134
|
key += SettingGroupTemplate.PrivateKey;
|
135
|
key = key.ToMD5();
|
136
|
Cookie.Set( "PrivateKey" , key);
|
137
|
}
|
138
|
|
139
|
/// <summary>
|
140
|
/// 验证Cookie
|
141
|
/// </summary>
|
142
|
static void CheckKey()
|
143
|
{
|
144
|
string key = "" ;
|
145
|
foreach (var s in CookieKeys)
|
146
|
{
|
147
|
key += s;
|
148
|
key += "=" ;
|
149
|
key += Cookie.Get(s);
|
150
|
key += "&" ;
|
151
|
}
|
152
|
string privateKey = Cookie.Get( "PrivateKey" );
|
153
|
if (privateKey == null )
|
154
|
{
|
155
|
string _key = "" ;
|
156
|
foreach (var s in CookieKeys)
|
157
|
{
|
158
|
_key += s;
|
159
|
_key += "=" ;
|
160
|
_key += "&" ;
|
161
|
}
|
162
|
if (key == _key)
|
163
|
{
|
164
|
SetKey();
|
165
|
return ;
|
166
|
}
|
167
|
}
|
168
|
key += SettingGroupTemplate.PrivateKey;
|
169
|
key = key.ToMD5();
|
170
|
if (privateKey == null )
|
171
|
{
|
172
|
|
173
|
}
|
174
|
if (key != privateKey)
|
175
|
{
|
176
|
throw new ExceptionMessage(Lang.DefineEnum.Cookie验证出错.Define());
|
177
|
}
|
178
|
}
|
179
|
}
|
180
|
}
|
----------------------------------------
好了,我默认在我的Cookies类中添加了几个常用到的值为读取这些Cookies的时候进行MD5验证,以保证Cookies的安全性
然后只要在你的网站项目中引用上面两个类,
然后在任意一个网站写入代码
Z.Core.Tools.CookieGroupTemplate.UserCode = "123";
然后在其他网站中用代码
Z.Core.Tools.CookieGroupTemplate.UserCode;
都可以读取得到这个登录用户的ID
是不是很简单啊。。。。
出处:http://www.cnblogs.com/JerryBaxia/archive/2010/08/22/1805648.html
欢迎转载,但需保留版权。
路径:WINDOWS\system32\drivers\etc\hosts
内容
127.0.0.1 localhost
一. Hosts文件的位置
很多用户都知道在Window系统中有个Hosts文件(没有后缀名),在Windows 98系统下该文件在Windows文件夹。
在Windows 2000/XP/Vista系统中位于\%Systemroot%\System32\Drivers\Etc 文件夹中,其中,%Systemroot%指系统安装路径。例如,Windows XP 安装在C:\WINDOWS,那么Hosts文件就在C:\WINDOWS\system32\drivers\etc中。
你也可以用windows自带的查找功能搜索找到hosts文件。
该文件其实是一个纯文本的文件,用普通的文本编辑软件如记事本等都能打开和编辑。
二. Hosts文件的基本内容和语法
用记事本打开hosts文件,就可以看见了微软对这个文件的说明。Hosts文件文一般有如下面的基本内容
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
127.0.0.1 localhost
这个文件是根据TCP/IP for Windows 的标准来工作的。它的作用是定义IP地址和
Host name(主机名)的映射关系,是一个映射IP地址和Host name (主机名) 的规定。这个规定中,要求每段只能包括一个映射关系,也就是一个IP地址和一个与之有映射关系的主机名。 IP地址要放在每段的最前面,映射的Host name(主机名)在IP后面,中间用空格分隔。对于这段的映射说明,用“#”分割后用文字说明。
三. Hosts文件的工作方式
现在让我们来看看Hosts在Windows中是怎么工作的。
我们知道在网络上访问网站,要首先通过DNS服务器把要访问的网络域名(XXXX.com)解析成XXX.XXX.XXX.XXX的IP地址后,计算机才能对这个网络域名作访问。
要是对于每个域名请求我们都要等待域名服务器解析后返回IP信息,这样访问网络的效率就会降低,因为DNS做域名解析和返回IP都需要时间。
为了提高对经常访问的网络域名的解析效率,可以通过利用Hosts文件中建立域名和IP的映射关系来达到目的。根据Windows系统规定,在进行DNS请求以前,Windows系统会先检查自己的Hosts文件中是否有这个网络域名映射关系。如果有则,调用这个IP地址映射,如果没有,再向已知的DNS服务器提出域名解析。也就是说Hosts的请求级别比DNS高。
四. Hosts文件的工作方式和具体作用
现在来看一下Hosts文件的工作方式以及它在具体使用中起哪些作用。
1、加快域名解析
对于要经常访问的网站,我们可以通过在Hosts中配置域名和IP的映射关系,提高域名解析速度。由于有了映射关系,当我们输入域名计算机就能很快解析出IP,而不用请求网络上的DNS服务器。
2、方便局域网用户
在很多单位的局域网中,会有服务器提供给用户使用。但由于局域网中一般很少架设DNS服务器,访问这些服务器时,要输入难记的IP地址。这对不少人来说相当麻烦。现在可以分别给这些服务器取个容易记住的名字,然后在Hosts中建立IP映射,这样以后访问的时候,只要输入这个服务器的名字就行了。
3、屏蔽网站
现在有很多网站不经过用户同意就将各种各样的插件安装到你的计算机中,其中有些说不定就是木马或病毒。对于这些网站我们可以利用Hosts把该网站的域名映射到错误的IP或本地计算机的IP,这样就不用访问了。在WINDOWSX系统中,约定127.0.0.1为本地计算机的IP地址, 0.0.0.0是错误的IP地址。
如果,我们在Hosts中,写入以下内容:
127.0.0.1 # 要屏蔽的网站 A
0.0.0.0 # 要屏蔽的网站 B
这样,计算机解析域名 A和 B时,就解析到本机IP或错误的IP,达到了屏蔽网站A 和B的目的。
4、顺利连接系统
对于Lotus的服务器和一些数据库服务器,在访问时如果直接输入IP地址那是不能访问的,只能输入服务器名才能访问。那么我们配置好Hosts文件,这样输入服务器名就能顺利连接了。
五. 屏蔽不想访问的网站的例子
这里给出一些收集到的利用Hosts文件对一些网址屏蔽的例子,共大家学习使用Hosts文件时参考。
例1.
在 hosts文件中加入如下内容就可以屏蔽文件中定义的对应的网址。
127.0.0.1 localhost
127.0.0.1 download.3721.com
127.0.0.1 3721.com #3721网络实名
127.0.0.1 3721.net #3721网络实名
127.0.0.1 cnsmin.3721.com #3721网络实名
127.0.0.1 cnsmin.3721.net #3721网络实名
127.0.0.1 download.3721.com #3721网络实名
127.0.0.1 download.3721.net #3721网络实名
127.0.0.1 www.3721.com #3721网络实名
127.0.0.1 www.3721.net #3721网络实名
例2.
在 hosts文件中加入如下内容就可以屏蔽文件中定义的对应的网址。
127.0.0.1 localhost
127.0.0.1 bar.baidu.com #百度IE搜索伴侣
127.0.0.1 www.baidu.com #百度IE搜索伴侣
127.0.0.1 baidu.com #百度IE搜索伴侣
例3.
免疫一些病毒
# *********免疫机器狗木马病毒******************
127.0.0.1 yu.8s7.net
127.0.0.1 1.jopanqc.com
127.0.0.1 2.joppnqq.com
127.0.0.1 wg.47255.com
127.0.0.1 1.joppnqq.com
127.0.0.1 xxx.m111.biz
127.0.0.1 1.jopenqc.com
127.0.0.1 1.jopenkk.com
127.0.0.1 xxx.vh7.biz
127.0.0.1 xxx.j41m.com
127.0.0.1 3.joppnqq.com
127.0.0.1 d.93se.com
127.0.0.1 www.868wg.com
127.0.0.1 xxx.mmma.biz
127.0.0.1 ilove.com
127.0.0.1 tp.shpzhan.cn
127.0.0.1 www.tomwg.com
127.0.0.1 www.cike007.cn
127.0.0.1 www.22aaa.com
127.0.0.1 xx.exiao01.com
127.0.0.1 www.exiao01.com
127.0.0.1 www.exiao01.com
127.0.0.1 new.749571.com
127.0.0.1 xtx.kv8.info
127.0.0.1 cao.kv8.info
127.0.0.1 1.jopmmqq.com
127.0.0.1 171817.171817.com
127.0.0.1 d2.llsging.com
127.0.0.1 down.malasc.cn
127.0.0.1 llboss.com
127.0.0.1 nx.51ylb.cn
127.0.0.1 my.531jx.cn
127.0.0.1 qqq.dzydhx.com
127.0.0.1 qqq.hao1658.com
127.0.0.1 www.333292.com
127.0.0.1 down.18dd.net
127.0.0.1 up.22x44.com
127.0.0.1 aaa.faba01.com
127.0.0.1 bad.tqdlt.cn
127.0.0.1 1.chsipo.com
127.0.0.1 c3.aishangai.net
127.0.0.1 c2.aishangai.net
127.0.0.1 xxx.188dm.com
127.0.0.1 x2.1a2b3c1.com
127.0.0.1 d1.163500.net
127.0.0.1 down.google-serv.cn
# *********结束******************
# *********免疫磁碟机dummycom病毒******************
127.0.0.1 gxgxy.net 127.0.0.1 c0mo.com
# *********免疫磁碟机dummycom结束******************
最后要指出的是,Hosts文件配置的映射是静态的,如果网络上的计算机更改了请及时更新IP地址,否则将不能访问。
转载于:https://www.cnblogs.com/TTTT/archive/2011/03/06/1971991.html
利用Cookies实现ASP.NET跨域单点登录相关推荐
- Cookie同域,跨域单点登录
Cookie 同域单点登录最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录.单点登录: ...
- JavaWeb跨域单点登录
B/S架构前后端分离项目实现跨域单点登录方案设计 项目需求: 1.前后端分离项目,由后端实现会话管理,同时校验用户权限: 2.多个项目单点登录,允许跨域访问: 3.预留CS架构客户端点击按钮打开浏览器 ...
- cas跨域单点登录原理_CAS实现SSO单点登录原理
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
- 跨域单点登录方案实现
SSO英文全称Single Sign On,单点登录.当我们搜索单点登录的时候,会发现很多的文章,然而这些文章一般都是基于一种通用的场景描述,通常在各自的业务环境会更加复杂.在本篇文章,我将描述具体场 ...
- php跨域单点登录,SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析...
SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1. 跨域redirect实例: te ...
- SSO跨域单点登录实现方案
SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否 ...
- cas跨域单点登录原理_基于CAS的SSO单点登录-实现ajax跨域访问的自动登录
先补课,以下网址可以把CAS环境搭起来. [问题背景]两个系统的整合就不说了,简单来说就是网页放在NginX上,但是ajax调用tomcat的API获取数据,其中tomcat段用CAS做身份认证.具体 ...
- 利用cookie的跨域单点登录的简单实现
Configuration: 1. Web.Config 在两个站点的配置配置文件machine节点上相同的validationKey, decryptionKey and validation的值, ...
- 实现基于 ASP.NET Forms 身份验证的跨子域单点登录
对于跨应用程序的 ASP.NET Forms 身份验证,相信大家应该都不陌生,几年前很多文章都介绍了如何实现,比如 MSDN 的 跨应用程序进行 Forms 身份验证,唐朝程序员 的 ASP.NET站 ...
- 利用nginx 反向代理解决跨域问题
利用nginx 反向代理解决跨域问题 参考文章: (1)利用nginx 反向代理解决跨域问题 (2)https://www.cnblogs.com/hpx2020/p/9928175.html 备忘一 ...
最新文章
- 求二维数组中最大子数组的和
- 查看SQL Server被锁的表以及如何解锁
- 服务器2012用什么虚拟机,虚拟机搭建Windows Server2012测试环境
- 步态识别 GaitSet
- BZOJ 1101: [POI2007]Zap
- Java网络02 Servlet开胃酒
- (pytorch-深度学习)通过时间反向传播
- Map封装 (一个键多个值)
- ApacheCN 所有教程/文档集已备份到 Coding
- PHP去除顽固空格和编码问题
- 使用Zabbix的SNMP trap监控类型监控设备的一个例子
- ​​​​iPhone 或 Mac 忘记登录密码,怎么快速找回
- ArcEngine 相关-转载
- 关于安装QCAT/QXDM异常的问题
- inode对接微软服务器,H3C iNode智能客户端安装指导(Windows)-7.3-5PW102
- 为什么计算机能读懂 1 和 0 ?
- Mac 上安装mysql
- 金融大数据信用评分模型解析
- Set 集合以及Set集合的一些常用方法
- XiaoHu日志 4/17