单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

下面的sso是在同一个顶级域名下,多个子域。

1、sso需要一个令牌,用来为每个站点作为身份凭证,一般令牌用 Guid。

private string GetTokenValue()
{
return System.Guid.NewGuid().ToString();
}

  

private string GetTokenValue()
{
return System.Guid.NewGuid().ToString();
}

  

2、建一个passport的站点,用来做登录验证,登录成功以后,生成令牌,写入cookie的Token,并把用户信息和Token保存在缓存中,缓可以用System.Web.HttpRuntime.Cache,也可以用memcache,通常用memcache,因为可以做分布式存储。

写入cookie:

string _token = GetTokenValue();
HttpCookie cookie = new HttpCookie("token");
cookie.Value = _token;
cookie.Expires = DateTime.Now.AddDays(1);
cookie.Domain = ".cc.com";
Response.Cookies.Add(cookie);

  

存入缓存:

/// <summary>
/// 将用户信息保存在缓存中
/// </summary>
/// <param name="user"></param>
private void InsertCache(User user)
{
System.Web.Caching.Cache cache = System.Web.HttpRuntime.Cache;
List<User> list = new List<Entity.User>();
if (cache["User"] == null)
{
list.Add(user);
}
else
{
list = cache["User"] as List<User>;
list.Add(user); }
cache.Insert("User", list, null, DateTime.MaxValue, TimeSpan.FromMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["Timeout"]))); }

  

3、第2步是直接在pssport登录,如果是在其他站点登录,那么就要先判断是否已经登录,这时候可以先从cookie判断是否存在token,如果存在,就去passport验证是否对的token,这个怎么验证呢?可以用服务远程判断,一般用wcf,如果成功说明已经登录成功,就可以把用户信息保存在session,用session比较安全,cookis一般用来保存不是很隐密的信息。如果验证不正确,或者cookie并不存在token,那就需要跳到passport进行登录,然后再跳原站点。

实现代码:

protected override void OnLoad(EventArgs e)
{
if (Request.Cookies["Token"] == null)
{
Response.Redirect(this.Sites.PassPortSite + "/login.aspx?gotourl=" + this.Sites.AdminSite + "/default.aspx");
}
else
{
if (Session["member"] == null)
{
HttpCookie cookie = Request.Cookies["token"]; WebClient MyWebClient = new WebClient();
MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或配置用于对向Internet资源的请求进行身份验证的网络凭据。
string weburl = this.Sites.PassPortSite+"/gettoken.aspx?token=" + cookie.Value.ToString();
Byte[] pageData = MyWebClient.DownloadData(weburl);//从指定网站下载数据
//string pageHtml = Encoding.Default.GetString(pageData); //假如获取网站页面采用的是GB2312,则使用这句 //这段红色的代码本来应该是用服务调用的,只是为了简单,就直接取值了
string pageHtml = Encoding.UTF8.GetString(pageData); //假如获取网站页面采用的是UTF-8,则使用这句 if (!string.IsNullOrEmpty(pageHtml.Trim()))
{
int id = Convert.ToInt32(pageHtml);
IUserBiz userBiz = new UserBiz();
Session["member"] = userBiz.GetUser(id);
}
else
{
Session["member"] = null;
Response.Redirect(this.Sites.PassPortSite + "/login.aspx?gotourl="+this.Sites.AdminSite+"/default.aspx");
}
}
}
base.OnLoad(e);
}

好了,单点登录的过程就是这样了,但这是实现了单点登录,还有session并没有共享,现在每个站点的session还不是同一个sessionid。

单点登录(SSO)(原创)的更多相关文章

  1. cas单点登录 SSO 的实现原理

    原文出处: cutesource   欢迎分享原创到伯乐头条 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户 ...

  2. 单点登录 SSO 的实现原理

    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任. 单点登录在大型网站里使用 ...

  3. Atitit. 单点登录sso 的解决方案 总结

    Atitit.  单点登录sso 的解决方案 总结 1. 系统应用场景and SSO模式选型 2 2. 系统应用的原则与要求 2 2.1. 开发快速简单::绝大部分系统来说,开发快速简单为主 2 2. ...

  4. 十六、【适合中小企业的.Net轻量级开源框架】EnterpriseFrameWork框架核心类库之单点登录SSO

    回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U 单点登录(Single Sign ...

  5. 单点登录SSO的实现原理

    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...

  6. 单点登录SSO原理

    最近接触了一点单点登录的知识,有一点理解,记录一下.有些问题并没有找到完美的解决方法,还需要找点已有框架来看看. 欢迎留言探讨. 1       概念 1.1     概念及理解 有一个网上广为流传的 ...

  7. CAS单点登录(SSO)完整教程

    转:http://blog.csdn.net/frinder/article/details/7969925 CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的 ...

  8. Redis缓存实现单点登录SSO

    .NET基于Redis缓存实现单点登录SSO的解决方案 .NET基于Redis缓存实现单点登录SSO的解决方案   一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单 ...

  9. 单点登录SSO原则的实现

    单点登录SSO(Single Sign On)简单地把它是下一个在多系统环境中共存,在用户登录,不要在其他系统上的登录.这是用户第一次登录得到所有其他系统的信任. 单点登录在一个大型网站非常频繁使用, ...

  10. cas 单点登录(SSO)实验之二: cas-client

    cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...

随机推荐

  1. NOIP 算法模板

    Hash: #include <iostream> #include <cstdio> #include <cstdlib> #include <algori ...

  2. Codeforces Round #283 (Div. 2) A. Minimum Difficulty 暴力水题

    A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  3. wikioi 3130 CYD刷题(背包)

    题目描述 Description 下午,CYD要刷题了,已知CYD有N题可刷,但他只有M分钟的时间,而且他的智慧值为Q,也就是说他只能做出难度小于等于Q的题目.已知每题可得积分Ai,需花费时间Bi,难 ...

  4. .Net中的插件框架Managed Extensibility Framework

    Managed Extensibility Framework(MEF)是微软的一个用来扩展.NET应用程序的框架,它最初为了满足Visual Studio里的编辑器的需求,比如说,延迟加载所有东西和 ...

  5. setTimeout(fn, 0) 的作用

    在 zepto 源码中,$.fn 对象 有个 ready 函数,其中有这样一句 setTimeout(fn,0); 1 $.fn = { 2 ready: function(callback){ 3 ...

  6. svn提交代码忘写注释怎么办,我想补充上去?

    propset --revprop -r 24288--force "svn:log" "一级采购人在填写申报书,汇总批量删除二级采购人申报书时报错" http ...

  7. TCP半连接和syn攻击(转)

    TCP半连接和syn攻击 转载 2014年04月06日 21:36:10 4243 摘自:http://blog.sina.com.cn/s/blog_54b5ea250100g2r8.html SY ...

  8. python文本 去掉字符串前后空格

    python文本 去掉字符串前后空格 场景: 去掉字符串前后空格 可以使用strip,lstrip,rstrip方法 >>> a="abc".center (30 ...

  9. .net上开发winform

    c++用WinForm做界面的实现 因为笔者是以前是做C#的,对Winform情有独钟,最近想转C++,想把以前的一些Delphi转成c++,MFC我不熟而且用起来相当烦效果又丑,GTK图形库用起来太 ...

  10. 细说Unity3D(一)——移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑和 ...