• 单点登录的一些实现


    首先单点登录一定是要依赖客户端的,也就是客户端必须返回给服务器标识,这是原则

    那么,单点登录基础的解决方案就剩下了三个基本的

    1.Session

    2.Cookies

    3.URL

    因为客户端只能保存这三种基础信息

    1.Session,session是依赖于客户端的sessionID的而sessionID是存在Cookies或者URL中的,sessionID系统生成的原理 只要Request.Url.Host不同,sessionID就会重新生成Request.Url.Host相同的话sessionID是不变的,或者重新打开一个浏览器,sessionID也会重新生成,所以因为sessionID生成的原理,很难用session做SSO,如果想用session做SSO的话,也可以,思路是这样的,重写SessionID,然后每个用户登录后生成的SessionID固定,然后SessionID信息存在数据库中,系统跳转的时候去数据库验证sessionID,取出用户信息,这个优点是可以跨主域做单点登录。缺点是sessionID固定,安全性非常差

        public class SessionIdOverride : System.Web.SessionState.SessionIDManager
        {


            public SessionIdOverride()
            {
                //
                // TODO: Add constructor logic here
                //
            }
            public override string CreateSessionID(HttpContext context)
            {
                string sessionString = Guid.NewGuid().ToString() + context.Request.UserHostAddress;
                return sessionString ;
            }

            /// <summary>
            /// Gets a value indicating whether a session identifier is valid.
            /// </summary>
            /// <param name="id">The session identifier to validate.</param>
            /// <returns>
            /// true if the session identifier is valid; otherwise, false.
            /// </returns>
            public override bool Validate(string id)
            {
                try
                {
                    Guid testGuid = new Guid(id);

                    if (id == testGuid.ToString())
                        return true;
                }
                catch
                {
                }
                return true;
            }
        }

    2.Cookies用cookies

    在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名.但是可以在主域名相同的情况下,二级域名可以共享Cookies

    简单代码如下:———————————————————————————————————
    更新cooikes
    //如果存在cookie,则更新value属性;否则,new一个cookie。
    HttpCookie cookies = Request.Cookies["userName"];
    if (cookies == null)
    {
    cookies = new HttpCookie("userName", this.txtUserName.Text);
    cookies.Domain = "Common.com";
    Response.Cookies.Set(cookies);
    }
    else
    {
    cookies.Value = this.txtUserName.Text;
    cookies.Domain = "Common.com";
    Response.Cookies.Set(cookies);
    cookies = new HttpCookie("userName", this.txtUserName.Text);

    }
    读出COOKIES
    HttpCookie cookies = Request.Cookies["userName"];
    if (cookies != null)
    {

    this.TextBox1.Text = cookies.Value;
    }
    查看所有的COOKIES
    HttpCookieCollection cookies;
    HttpCookie oneCookie;
    cookies = Request.Cookies;
    string[] cookieArray = cookies.AllKeys;
    for (int i = 0; i < cookieArray.Length; i++)
    {

    oneCookie = cookies[cookieArray[i]];

    Response.Write(oneCookie.Name + " - " + oneCookie.Value);
    }

    将   Cookie   的有效范围限制到域  
      默认情况下,Cookie   与特定的域相关联。例如,如果您的站点是   www.contoso.com,那么当用户向该站点请求页面时,您编写的   Cookie   就被发送到服务器。(有特定路径值的   Cookie   除外,我在上一节刚刚解释过。)   如果您的站点有子域(例如   contoso.com、sales.contoso.com   和   support.contoso.com),就可以把   Cookie   同特定的子域相关联。为此,需要设置   Cookie   的   Domain   属性,如下所示:  
       
      Response.Cookies("domain").Value   =   DateTime.Now.ToString  
      Response.Cookies("domain").Expires   =   DateTime.Now.AddDays(1)  
      Response.Cookies("domain").Domain   =   "support.contoso.com"  
       
      如果按照这种方式设置域,则   Cookie   只能用于指定子域中的页面。  
       
      您也可以利用   Domain   属性来创建可在多个子域中共享的   Cookie。例如,对域进行如下设置:  
       
      Response.Cookies("domain").Value   =   DateTime.Now.ToString  
      Response.Cookies("domain").Expires   =   DateTime.Now.AddDays(1)  通用型cookies ,如果不加只在当前开的浏览器及子页面有效,关闭或新开都失效
      Response.Cookies("domain").Domain   =   "contoso.com"  
       
      这样,该   Cookie   就可用于主域、sales.contoso.com   和   support.contoso.com。  

     注:考虑到安全性,Cookies必须加密,最好序列化加密

    3.URL,URL的原理很简单,当跳转系统时,随机生成登录用户的URL,然后把URL对应的用户信息存到数据库中(或其它),跳到其它系统再根据URL取出来,然后把这个信息作废,实际仔细一想,和session的原理是一样的,就是麻烦些,不过这个更安全

  • 相关阅读:
    6.00 Introduction to Computer Science and Programming lec5: Objects in Python
    6.00 Introduction to Computer Science and Programming lec3 & lec4
    DB2中查询表信息
    修改 unity “显示桌面”快捷键的方法 (Ubuntu 12.10)
    Ubuntu 12.10中阻止启动chrome时“unlock default keyring ...”弹出窗口的方法
    6.00 Introduction to Computer Science and Programming lec1
    Thinkpad T61显卡门的解决(更换集成显卡的主板)
    Ubuntu 12.10中安装Sun的JDK
    【设计模式】抽象工厂
    【设计模式】概述
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1453218.html
Copyright © 2020-2023  润新知