zoukankan      html  css  js  c++  java
  • 单点登录(SSO)(原创)

    单点登录(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。

  • 相关阅读:
    Linux常用命令学习
    LA 6437 Power Plant (prim最小生成树)
    Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java
    hdu 1248 寒冰王座
    数据结构——算法之(031)(将字符串中全部小写字母排在大写字母的前面)
    X-射线:探索原子世界的利器
    关于sql中的with(nolock)
    Netty In Action中文版
    抓包报文分析
    POJ 1562 Oil Deposits
  • 原文地址:https://www.cnblogs.com/ruiati/p/3262033.html
Copyright © 2011-2022 走看看