单点登陆(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只须要登陆一次就能够访问全部相互信任的应用系统。web
下面的sso是在同一个顶级域名下,多个子域。缓存
一、sso须要一个令牌,用来为每一个站点做为身份凭证,通常令牌用 Guid。安全
private string GetTokenValue() { return System.Guid.NewGuid().ToString(); }
private string GetTokenValue() { return System.Guid.NewGuid().ToString(); }
二、建一个passport的站点,用来作登陆验证,登陆成功之后,生成令牌,写入cookie的Token,并把用户信息和Token保存在缓存中,缓能够用System.Web.HttpRuntime.Cache,也能够用memcache,一般用memcache,由于能够作分布式存储。cookie
写入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);
存入缓存:session
/// <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"]))); }
三、第2步是直接在pssport登陆,若是是在其余站点登陆,那么就要先判断是否已经登陆,这时候能够先从cookie判断是否存在token,若是存在,就去passport验证是否对的token,这个怎么验证呢?能够用服务远程判断,通常用wcf,若是成功说明已经登陆成功,就能够把用户信息保存在session,用session比较安全,cookis通常用来保存不是很隐密的信息。若是验证不正确,或者cookie并不存在token,那就须要跳到passport进行登陆,而后再跳原站点。分布式
实现代码:ide
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。网站