利用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 

<appSettings>
<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地址,否则将不能访问。   

posted @ 2011-03-06 02:28  TiTi  阅读(962)  评论(0编辑  收藏  举报