2017-04-18 71 views
0

你能告訴我如何殺死某人的會話,並讓他們從我的MVC應用程序註銷。 我目前的計劃是:通過界面菜單殺死用戶的會話和註銷

  1. 在應用程序的啓動加載SessionsCache
  2. 當用戶登錄 - 拯救他的會議tblSessions和部分地重新加載緩存(在其加入會話沒有使它調用DB)
  3. 每30秒就有一個Ajax會驗證我是否有會話或不
  4. 管理員必須包含在緩存中的所有活動會話的接口工具,他殺死會話時,他刪除它從緩存和DB
  5. 在下ajax cal l用戶不會有會話,並且將logouted
  6. 如果用戶註銷通常在緩存中的會話和DB將被刪除
  7. 每30分鐘上的緩存全部重新加載會做

請考慮我的應用程序具有OnActionExecuting()重寫功能,它檢查用戶是否有會話,如果沒有登錄他。 但是這隻發生在動作執行上,並且如果用戶不點擊任何地方(afk),他將不會被重定向到主頁。 (考慮到可能的AJAX調用查看會話是多餘的?)

我也想,當他關閉了瀏覽器/標籤不使用註銷按鈕來清除用戶會話,但我不知道怎麼能這樣呢

+0

爲了讓客戶端知道會話是否過期,必須進行ajax調用以檢查活動會話。 –

+0

同樣爲了在用戶關閉瀏覽器時清除會話,也必須涉及輪詢。 –

+0

@RyanSearle你能解釋我什麼是投票,或者至少給我一些鏈接,說明它在哪裏解釋?謝謝 –

回答

1

有您提出的解決方案的一些問題使其無法使用:

  1. 會話和身份驗證都使用客戶端cookie來管理其狀態。服務器只能使認證/會話失效。它不能直接「註銷」用戶,因爲該部分不受直接的服務器控制。換句話說,你可以設置一些說某個用戶應該註銷的東西,但該用戶實際上不會註銷,直到他們嘗試發出另一個請求,並且由服務器執行一些檢查,然後影響該請求當時用戶的狀態改變。

  2. 會話採用滑動超時。這意味着任何請求客戶端使得會重置他們的會話超時。換句話說,如果您每隔30秒長時間輪詢一次會話狀態,用戶將實際上擁有永不過期的永久會話。

  3. 會話有意匿名。出於安全原因,客戶端與會話的唯一鏈接是具有其會話ID的cookie。通過將Cookie設置爲成功攻擊中的必備組件,可以防止某種程度的會話劫持。有了像Secure令牌之類的東西,那麼當然在您的站點上使用SSL,則可以有效地防止該cookie在分配給它的客戶端之外的其他任何環境中都可用。總而言之,除了與用戶直接聯繫以外,沒有任何方法可以確定哪個會話屬於給定用戶。

  4. 緩存本質上是不穩定的。你可以說特定的鑰匙應該有一段時間的生命,但這只是一個建議。有許多不同的因素可能導致緩存項目被破壞,而這些因素大部分完全不受控制。

鑑於所有這一切,你必須從不同的方向來解決這個問題。我的建議是在一個單獨的表格中跟蹤登錄/會話,這是一般意義上的。它基本上是一種日誌。當用戶登錄或創建新會話時,您需要向該數據庫添加記錄。如果用戶的身份驗證或會話過期,則會更新相應的記錄。如果用戶故意註銷,您可以刪除該記錄或將其標記爲非活動狀態。就您的管理員而言,他們會管理此表,將記錄移除或標記爲非活動狀態。

然後,您將不得不圍繞您的網站操作添加一些邏輯來解釋此表。您可以創建一個操作篩選器來檢查此表並執行任何必要的操作。例如,如果用戶已被管理員「註銷」,操作篩選器將從該表中讀取相應的記錄,查看該用戶已被註銷,然後通過實際簽出用戶來影響該更改。

由於長輪詢會導致會話永不過期,您基本上需要管理自己的超時。例如,您可以在「日誌」表中記錄創建會話的時間,然後將該時間與每個後續請求(包括AJAX)上的當前時間進行比較。同樣,你可以爲此使用一個動作過濾器。如果會話根據您的超時「過期」,那麼您可以手動銷燬用戶的會話。

有很多其他的東西需要用這種方式添加或解釋,但希望能給你一個很好的工作框架。