2012-02-09 29 views
5

我正在開發一個ASP.net站點(使用.NET 4,EF,jQuery Ajax,SQL Server 2008 R2)。在這個網站我想阻止multi-login。我的意思是,如果您登錄到網站,則無法從其他瀏覽器或計算機再次登錄網站,因爲您已經登錄。如何防止用戶登錄到我的網站多個會話?

我廠的想法和發展它在我的網站,但它有一個問題,那是因爲,我決定在這裏問一個問題

我有這樣一個SQL Server表問題:

Id  [int]   NOT NULL IDENTITY(1,1) //PK 
UserId [int]   NOT NULL     //Relation to User table 
Key  [nvarchar](50) NOT NULL     //Unique 

當用戶登錄到該網站,我行插入這個表是這樣的:

UserId = The Id of logged in user 
Key = Session.SessionId 

,也沒有從該表中執行WH刪除記錄代碼EN:

  1. 用戶嘗試從其賬戶
  2. Session_End事件global.asax

一切以註銷工作的正確和完美的,只是:

問題:當用戶關閉瀏覽器,那行不會被刪除(我想當他關閉瀏覽器時,它在該表中的行將在Session_End事件中刪除,但它沒有!!!)

我該怎麼辦?任何解決這個問題的方法?我應該改變策略還是有解決方案?

對不起,我的語法不好。我用英語

是新的任何想法可能是有用的

問候

Foroughi

UPDATE1:我不使用ASP 會員和管理我的用戶自己

UPDATE2:我用InProc月我的會話狀態爲20分鐘超時

+6

當用戶進行新的登錄時,註銷現有會話不是更容易嗎?當用戶忘記註銷不同的位置(例如家庭/工作)時,這也更實用。 – 2012-02-09 08:14:55

+0

@marc_s感謝花花公子和遺憾他們 – 2012-02-09 08:16:23

+0

@AliForoughi:沒問題 - 問題依然清晰完全可以理解 – 2012-02-09 08:18:43

回答

2

當瀏覽器關閉時,Session_End事件不會觸發,當服務器在特定時間內未收到用戶請求時會觸發(默認爲20分鐘)。這意味着如果您使用Session_End刪除用戶,他們在關閉瀏覽器後將無法登錄20分鐘。

兩個替代戰略浮現在腦海

  1. 用戶離開該頁面時,您可以使用onunload事件在瀏覽器發送註銷請求到服務器(當然,這只是工作,如果用戶仍然具有網絡連接)。當您重新加載頁面時,也會觸發onunload事件,因此您必須跟蹤觸發事件的原因才能使用它。

  2. 您將最後一次請求的時間保留在用戶對象中。這樣,您可以確定用戶的活躍程度,以及他們離開網站的可能性。例如,找到兩分鐘內沒有做任何事的用戶並將其註銷。

編輯:正如意見中提出的最後一點。而不是將您的要求視爲'',您只能進行一次登錄,所以如果您已經登錄,則不允許登錄'您是否可以更改爲'如果您打開會話,您只能進行一次登錄,它將被取消並創建一個新的。'

這樣您仍然保持您的每個帳戶規則的一個登錄會話,同時提供更強大的方法來執行它。

+0

我更新我的問題,你現在怎麼看? – 2012-02-09 08:23:55

+0

我第一個想到的就是不夠好,但第二個好,我會的工作就可以了,感謝的人:) – 2012-02-09 08:29:27

+1

的方法可以結合起來,得到兩全其美。 – 2012-02-09 08:37:48

1

除了存儲狀態的方式/位置之外,您所遇到的問題是用戶可能無法註銷,從而導致會話仍處於活動狀態。我建議如下:

1)當用戶註銷或會話結束時會更改狀態(在您的情況下刪除記錄)(會話在n分鐘不活動後結束,請參閱web.config和global.asax事件處理程序)

2)如果用戶嘗試登錄第二次提供註銷以前會話的選項。

+0

我更新了我的問題,你現在怎麼看? – 2012-02-09 08:23:40

0

我認爲你應該嘗試水手。像這樣:

表結構:

ID 
UserID 
Flag 

當用戶登錄您更新表,並設置標誌真正或 當他被註銷其設置爲

當用戶關閉瀏覽器時,您應該決定是否將他註銷。如果是的話 - 你抓住這個事件作爲Session_End中並記錄了他自己和更新表

2

首先不使用數據庫作爲消息傳遞系統。這是一場災難。

你應該做的是讓一個字典在應用程序存儲中保存已登錄的用戶標識及其最後一個操作時間。每隔2-5分鐘在所有頁面上添加腳本,

收到ping後,更新用戶標識的最近活動時間,並刪除任何有「超時」的用戶標識。

+0

災難?哇,你的想法似乎不錯,我會進行這項工作的傢伙,謝謝:) – 2012-02-09 08:27:04

+1

爲什麼這是一個壞主意,使用數據庫的消息一般的原因是,它是非常低效的。在這種情況下,您可以使用速度更快的應用程序存儲。在其他情況下,您需要在數據庫之上實施複雜的系統以使通信正常工作(例如定期檢查而不是依賴事件,定期清理,檢查消息是否被讀取,排隊等)。所有這些機制通常都在適當的進程間通信框架中實施。 – linkerro 2012-02-09 08:34:34

+0

「定期檢查,而不是依靠事件」?是的,我得到你,這是不錯的主意,謝謝linkerro。我想你的意思是將會話信息存儲在應用程序狀態而不是數據庫中,並存儲它們的最後一個活動? – 2012-02-09 08:46:43