有沒有辦法檢測用戶是否已經登錄了另一個具有相同用戶名的會話,並阻止他再次登錄或發送消息?ASP.NET中每個用戶只限制一個會話
回答
您可以隨時在global.asax中實施事件。
實現的Application_Start()設置一個System.Collections.Dictionary(或在您的偏好)和存儲應用程序[]集合中,當用戶logsin,添加用戶名。從Session_End()中的集合中刪除。請記住在使用集合時使用「鎖定」關鍵字:)
玩得開心!
例子:
[page.aspx]
public partial class page : System.Web.UI.Page {
protected bool Login(string userName) {
System.Collections.Generic.List<string> d = Application["UsersLoggedIn"]
as System.Collections.Generic.List<string>;
if (d != null) {
lock (d) {
if (d.Contains(userName)) {
// User is already logged in!!!
return false;
}
d.Add(userName);
}
}
Session["UserLoggedIn"] = userName;
return true;
}
protected void Logout() {
Session.Abandon();
}
}
[global.asax]
<%@ Application Language="C#" %>
<script RunAt="server">
void Application_Start(object sender, EventArgs e) {
Application["UsersLoggedIn"] = new System.Collections.Generic.List<string>();
}
void Session_End(object sender, EventArgs e) {
// NOTE: you might want to call this from the .Logout() method - aswell -, to speed things up
string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty ? (string)Session["UserLoggedIn"];
if (userLoggedIn.Length > 0) {
System.Collections.Generic.List<string> d = Application["UsersLoggedIn"]
as System.Collections.Generic.List<string>;
if (d != null) {
lock (d) {
d.Remove(userLoggedIn);
}
}
}
}
</script>
如果您使用會話來控制授權,那是... – 2010-05-27 15:47:09
我試過這個解決方案,但我無法在Session_End上訪問應用程序,因爲我的HttpContext.Current爲空。我怎樣才能訪問它? – Inbal 2013-10-30 15:22:48
@FredrikJohansson:如果用戶關閉瀏覽器而不點擊LogOut,並再次嘗試使用相同的用戶名登錄,則用戶將無法登錄。我們如何解決這個問題? – nightfire001 2015-03-12 13:00:57
您可以將用戶的SessionID存儲在數據庫中。在每次登錄時,將唯一用戶名和SessionID組合存儲到數據庫中。在主頁面中,將查詢包括到數據庫中,以檢查當前使用的用戶名的最後一次登錄是否來自同一會話。如果沒有,放棄會話並重定向到登錄頁面。
我發佈的行爲應該註銷第二個用戶。您可以更改Session.Abandon到你想要的行爲
您可以通過保持用戶的跟蹤記錄中,在Global.asax中使用Application對象。
在在session_start方法或您的登錄方法,您可以檢查用戶存儲在應用程序對象。
在Session_End中的方法或在您的註銷方法,你需要從應用程序對象中刪除用戶。
我試過這個解決方案,但是我無法在Session_End上訪問應用程序,因爲我的HttpContext.Current爲null。我怎樣才能訪問它? – Inbal 2013-10-30 15:22:29
不要將其存儲在數據庫中,如果您不能識別用戶註銷事件(它們可以點擊註銷,關閉選項卡,關閉整個瀏覽器,或者可能只是關閉計算機......)。 使用會話進行相同的檢查。
- 1. 將會話限制爲只有一個用戶登錄實例
- 2. 限制WSO2IS中每個用戶的併發會話
- 3. django每個用戶一個會話
- 4. ASP.NET MVC:限制每個用戶的一個角色
- 5. 每個用戶JWT和一個(!)會話/無併發會話
- 6. 每用戶會話檢查一次 - asp.net
- 7. ASP.NET會話丟失,但僅限於一個特定用戶
- 8. 每個會話只顯示一次jQuery
- 9. 每個ASP.NET會話鎖定
- 10. 限制會話用戶PHP
- 11. 每個用戶組或每個用戶的Spring Security併發會話控制
- 12. 設計 - 爲同一用戶限制多個會話
- 13. Symfony2 PHP限制一個用戶會話20
- 14. 使每個用戶只有一次用會話用戶名投票
- 15. ASP.NET會話大小限制
- 16. 如何限制每個會話顯示一次preloader?
- 17. 在asp.net/c#中關聯唯一的會話ID與每個唯一用戶
- 18. CodeIgniter + QuickAuth +一個用戶,只有一個會話
- 19. Asp.Net頁面上的輸出緩存限於每個用戶的會話嗎?
- 20. 在Drupal 6.22中限制每個IP的一個用戶
- 21. 將應用程序限制爲Windows上每個shell會話的一個實例
- 22. 每個用戶會話可以使用ASP.NET主題
- 23. 需要一個div,每個會話只顯示一次
- 24. 如何限制用戶只有一個評論和評價每個項目?
- 25. 如何限制MySQL結果每個列表只有一個用戶ID
- 26. 一個會話中的多個用戶的ASP MVC http會話
- 27. Asp.net上每個用戶只有一個登錄
- 28. PHP每用戶多個併發會話
- 29. Asp.net會話:兩個不同的用戶可以訪問同一個會話
- 30. Spring/HornetQ:HQ154002:無法創建會話:每個連接只允許一個會話
有一個看看這篇文章: http://www.sharepoint4developers.net/en-nz/post/limit-session-account.aspx – 2012-02-27 19:45:02