2014-01-21 49 views
10

我已經實現ASP.Net身份跟隨這裏的示例代碼之後: https://github.com/rustd/AspnetIdentitySampleASP.Net身份Identity.IsAuthenticated仍然是正確的,即使刪除用戶

我在執行我檢查,如果用戶進行身份驗證 - 這是從我的MVC控制器上的FilterAttribute調用;這個想法是我想確認在提供頁面之前他們仍然是auth'ed。

所以在我的過濾器,下面的代碼最終會被調用:

_authenticationManager.User.Identity.IsAuthenticated; 

_authenticationManager是在這裏:

private IAuthenticationManager _authenticationManager 
{ 
    get 
    { 
     return _httpContext.GetOwinContext().Authentication; 
    } 
} 

_httpContext傳遞到我的identityProvider類的構造函數。

現在 - 一旦我登錄,_authenticationManager.User.Identity.IsAuthenticated;返回true預期。

但是,在開發過程中,我傾倒並重新播種了我的數據庫,而無需添加用戶。如此有效,我刪除了IdentityUser - 但_authenticationManager.User.Identity.IsAuthenticated; STILL返回true

任何想法,爲什麼這是?我只能假設它以某種方式檢查cookie,而不是實際查看數據庫。它是否正確?

還是我搞砸了我的執行.....

+3

一般來說,數據庫不會在每個請求上被檢查; cookie(或其他機制)正在存儲包括登錄信息的加密細節。在再次檢查後備存儲之前,登錄將保持有效。 –

+0

嗯...所以對我來說,使'IsAuthenticated'屬性浪費空間,如果不是的話,那就是安全漏洞!我可以刪除一個用戶,以防止他們訪問,但這可以讓他們徘徊在.. O_o – Darren

+0

你應該鎖定他之前像刪除他像whith許多無效的登錄嘗試 – CheGueVerra

回答

15

這並不讓IsAuthenticated一個安全漏洞。我們來看看實際的身份驗證過程。

  1. 您設置在各地的地方登錄頁面是你的web.config一些東西,多長的登錄是很好的,以及是否使用滑動過期(如果該時間,如果用戶是活躍在擴大您的網站)

  2. 用戶訪問您的網站,輸入他們的用戶名和密碼。

  3. 該信息已發佈到您的服務器。你拿這些信息,驗證它是正確的(驗證)。如果它是正確的,服務器會發出一個加密的cookie,稱爲FormsAuthenticationTicket注意 - 這可能在新的標識中有不同的名稱,但原理相同。

  4. 該cookie的內容包括諸如用戶名和登錄失效日期等項目。

  5. 在每個請求上,服務器都會查看Cookie集合以獲取身份驗證Cookie。如果找到,它將解密它,讀取值並確定它是否仍然是有效的cookie(到期時間)。一旦它具有來自cookie的用戶信息,服務器可以使用該信息來確定用戶是否被授權請求資源(通過用戶名查找)。

5A。如果Cookie不存在或已過期,則用戶將被重定向回登錄頁面。

6.當用戶註銷時,cookie將從cookie集合中刪除。現在,如果用戶試圖轉到僅用於授權用戶的資源,則服務器在上面的5a處結束。

因此,就你而言,你手動刪除了一個用戶。這並不改變這個用戶之前已經用一個仍然有效的cookie進行驗證的事實。因此,IsAuthenticated正在返回預期值。用戶在更改其用戶狀態之前已通過身份驗證。 IsAuthenticated並不意味着,這個用戶在我的數據庫中仍然有效。

如果您要運行一個站點,您不斷刪除/停用用戶,請覆蓋AuthorizeAttributeOnRequestAuthorization方法以查看用戶是否確實仍在數據庫中。另外,請注意,如果用戶名不存在(因爲您刪除了該用戶名),則role/userId的任何查找都將失敗。您可以捕獲該異常/故障並返回屬性未經授權的響應。

+1

優秀 - 謝謝你的詳細答案:) – Darren

相關問題