SSO與用戶登錄問題容易混淆

單點登陸(SSO),多個系統一次登陸權限均配,
彼此訪問無需要再次登陸!
大多都是用webservice實現令牌傳遞,跨系統,跨平臺的權限驗證。

用數據表實時性不是很好,要總刷新,數據庫壓力大
如果程序出錯,比如操作數據庫失敗,就不準確了

用Application比較好,但是頻繁操作Application會對網站的性能有影響

最好的辦法就是設置一個靜態變量
asp.net的靜態變量就是爲了幹這個的
因爲靜態變量是類的全部實例共享的

我用這種方法寫了一段代碼,這段代碼是適用於windows驗證的情況,代碼編譯通過,我沒有測試,但是道理是這樣的。
-------------------------------------------------------------------------------
1. 定義一個通用類


using System;
using System.Collections;

namespace Web
{
/// <summary>
/// CheckUserLogon 的摘要說明。
/// </summary>
public class CheckUserLogon
{

public static Hashtable userList = new Hashtable();

public CheckUserLogon()
{
//
// TODO: 在此處添加構造函數邏輯
//
}

public static void AddUserList( string user )
{
userList.Add( user , "online" );
}

public static void RemoveUserList( string user )
{
userList.Remove( user );
}

public static bool CheckUserLogined( string user )
{
if ( userList.ContainsKey( user ) )
{
return true;
}
else
{
return false;
}
}


}
}

2.在Global.asax中修改session_start()和session_end()

protected void Session_Start(Object sender, EventArgs e)
{
if ( CheckUserLogon.CheckUserLogined( this.User.Identity.ToString() ) )
{ //如果已經有同名用戶登錄,就清空session,這樣用戶就不能使用
this.Session.Clear();
}
else
{ //如果沒有同名用戶登錄,就記錄當前用戶
CheckUserLogon.AddUserList( this.User.Identity.ToString() );
}
}


protected void Session_End(Object sender, EventArgs e)
{
CheckUserLogon.RemoveUserList ( this.User.Identity.ToString() );
}



if ( CheckUserLogon.CheckUserLogined( this.User.Identity.ToString() ) )
{ //轉到另一個頁面,這裏提示用戶已經有同名用戶登錄
this.Response.Redirect("aaa.aspx")
}
else
{ //如果沒有同名用戶登錄,就記錄當前用戶
CheckUserLogon.AddUserList( this.User.Identity.ToString() );
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章