首先單點登入一定是要依賴用戶端的,也就是用戶端必須返回給伺服器標識,這是原則
那麼,單點登入基礎的解決方案就剩下了三個基本的
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的原理是一樣的,就是麻煩些,不過這個更安全