单点登录(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. bzoj 3672 利用点分治将CDQ分治推广到树型结构上

    最大的收获就是题目所说. deal(s) : 处理节点s所在块的问题,并保证: 1.s是该块中最靠近根节点的点,没有之一. 2.s所在块到根节点的路径上的点全都用来更新过了s所在块的所有节点. 然后步 ...

  2. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  3. nodejs环境使用jshint

    一.概述jshint是检测JavaScript语法问题的工具,可以根据自己的需要配置检测规则. 二.安装npm install jshint -g一般全局安装就可以了,可以在任何目录下使用jshint ...

  4. Python开发_python的安装

    Python几乎可以在任何平台下运行,如我们所熟悉的:Windows/Unix/Linux/Macintosh. 在这里我们说一下,在Windows操作系统中安装python. 我的操作系统为:Win ...

  5. node.js第11课(HTTPclient)

     一.http模块提供了两个函数http.request和http.get,功能是作为client向HTTPserver发起请求.     Ext.Ajax.request({},function ...

  6. MVC使用Entity Framework Code First,用漂亮表格显示1对多关系

    部门和职员是1对多关系.用一个表格列出所有部门,并且在每行显示该部门下的所有职员名称.如下: 部门和职员的Model: using System.Collections.Generic; namesp ...

  7. VS2010 打包生成exe文件后 执行安装文件出现 TODO:&lt;文件说明&gt;已停止工作并已关闭

    一.VS2010 打包生成exe文件后  执行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了 ...

  8. pytest文档18-配置文件pytest.ini

    前言 pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行. ini配置文件 pytest里面有些文件是非test文件 py ...

  9. Java 8 的新特性和改进总览

    这篇文章是对Java 8中即将到来的改进做一个面向开发者的综合性的总结,JDK的这一特性将会在2013年9月份发布. 在写这篇文章的时候,Java 8的开发工作仍然在紧张有序的进行中,语言特新和API ...

  10. “==”和equals之间的区别

    通俗点讲,==是看看左右是不是一个东西.equals是看看左右是不是长得一样.如果单纯是想记住,==:等于.equals:相同.两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个 ...