您的位置:首页 > 编程语言 > ASP

利用Cookies实现ASP.NET跨域单点登录

2010-08-22 03:46 369 查看
在一开始学习用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

2:在两个网站的Web.config中添加appsetting

<appSettings>
<add key="RootDomain" value="mysite.com"/>
<add key="PrivateKey" value="12345678"/>
</appSettings>


这是为了方便网站以后换域名的时候不用更改代码,PrivateKey是防止篡改Cookies而效仿网银功能添加多一个MD5验证功能

3:编写Cookies操作类


4:编写登录凭证类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Z.Core.Tools
{
/// <summary>
/// 网站Cookie集合
/// </summary>
public class CookieGroupTemplate
{
/// <summary>
/// 登录User
/// </summary>
public static string UserCode
{
get
{
CheckKey();
return Z.Core.Tools.Cookie.Get("UserCode");
}
set
{
Z.Core.Tools.Cookie.Set("UserCode", value);
SetKey();
}
}

/// <summary>
/// 登录用户名
/// </summary>
public static string UserName
{
get
{
CheckKey();
return Z.Core.Tools.Cookie.Get("UserName");
}
set
{
Z.Core.Tools.Cookie.Set("UserName", value);
SetKey();
}
}

/// <summary>
/// 登录用户父级代码
/// </summary>
public static string ParentCode
{
get
{
CheckKey();
return Z.Core.Tools.Cookie.Get("ParentCode"); ;
}
set
{
Z.Core.Tools.Cookie.Set("ParentCode", value);
SetKey();
}
}

/// <summary>
/// 登录用户父级名称
/// </summary>
public static string ParentName
{
get
{
CheckKey();
return Z.Core.Tools.Cookie.Get("ParentName");
}
set
{
Z.Core.Tools.Cookie.Set("ParentName", value);
SetKey();
}
}

/// <summary>
/// 登录权限组
/// </summary>
public static string Groups
{
get
{
CheckKey();
return Z.Core.Tools.Cookie.Get("Groups"); ;
}
set
{
Z.Core.Tools.Cookie.Set("Groups", value);
SetKey();
}
}

/// <summary>
/// 操作位置
/// </summary>
public static string OperateFrom
{
get
{
return Z.Core.Tools.Cookie.Get("OperateFrom");
}
set
{
Z.Core.Tools.Cookie.Set("OperateFrom", value);
}
}

/// <summary>
/// 加密Cookies定义
/// </summary>
static List<string> CookieKeys = new List<string>()
{
"UserCode","UserName","ParentCode","ParentName","Groups","OperateFrom"
};

/// <summary>
/// 生成验证Key
/// </summary>
static void SetKey()
{
string key = "";
foreach (var s in CookieKeys)
{
key += s;
key += "=";
key += Cookie.Get(s);
key += "&";
}
key += SettingGroupTemplate.PrivateKey;
key = key.ToMD5();
Cookie.Set("PrivateKey", key);
}

/// <summary>
/// 验证Cookie
/// </summary>
static void CheckKey()
{
string key = "";
foreach (var s in CookieKeys)
{
key += s;
key += "=";
key += Cookie.Get(s);
key += "&";
}
string privateKey = Cookie.Get("PrivateKey");
if (privateKey == null)
{
string _key = "";
foreach (var s in CookieKeys)
{
_key += s;
_key += "=";
_key += "&";
}
if (key == _key)
{
SetKey();
return;
}
}
key += SettingGroupTemplate.PrivateKey;
key = key.ToMD5();
if (privateKey == null)
{

}
if (key != privateKey)
{
throw new ExceptionMessage(Lang.DefineEnum.Cookie验证出错.Define());
}
}
}
}


----------------------------------------

好了,我默认在我的Cookies类中添加了几个常用到的值为读取这些Cookies的时候进行MD5验证,以保证Cookies的安全性

然后只要在你的网站项目中引用上面两个类,

然后在任意一个网站写入代码

Z.Core.Tools.CookieGroupTemplate.UserCode = "123";

然后在其他网站中用代码

Z.Core.Tools.CookieGroupTemplate.UserCode;

都可以读取得到这个登录用户的ID

是不是很简单啊。。。。

出处:/article/7187777.html

  欢迎转载,但需保留版权。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: