单点登录的一些实现

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

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

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的原理是一样的,就是麻烦些,不过这个更安全

原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1453218.html