首先单点登录一定是要依赖客户端的,也就是客户端必须返回给服务器标识,这是原则
那么,单点登录基础的解决方案就剩下了三个基本的
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的原理是一样的,就是麻烦些,不过这个更安全