2016-11-14 123 views
0

在我的ASP MVC項目中,我實現了OWIN CookieAuthentication。除未經授權的請求外,所有程序都運行正常。 例如,考慮流動:Owin未經授權的請求未註銷用戶

  1. 用戶登錄
  2. 用戶點擊了該用戶無權訪問的端點。

通過限制:

[Authorize(Roles = "SomeRoleUserDontHaAssigned")] 
public ActionResult SomeAction()... 

發生這種情況時用戶被重定向到帳戶/登錄路徑(這是確定),但他沒有得到註銷(這是我所期望的)。

這是預期的行爲,所以我應該實現我自己的AuthorizeAttribute,我應該手動刪除cookie(或調用Account/SignOut)?或者我錯過了什麼?

+1

你爲什麼期望這樣的事情?作爲用戶,如果我每次遇到無法訪問的資源時都必須重新登錄,我會感到有點生氣。你可以通過自定義的AuthorizeAttribute來做到這一點,但是你應該怎麼做? –

+0

我明白你的觀點。我應該詳細說明一點:從用戶體驗角度來看,我完全同意你的看法。我真正想說的是:如果它已經重定向到登錄頁面,那麼(並且只有這樣)我纔會期望首先註銷用戶,因爲登錄已登錄用戶的是什麼?這不是很奇怪嗎?另一方面,完全正確的解決方案當然是重定向到一些自定義的「訪問被拒絕」頁面。順便說一句,那是在哪裏設置的? –

+0

我無法完全理解您的問題,您如何期望用戶在登錄受限制的頁面時應該註銷?用戶登錄的唯一方式是在Cookie死亡或者通過身份驗證管理器(authenticationManager.SignOut) – SaadK

回答

1

我決定把它放在一個答案中,因爲它可能不適合一個評論。

首先,讓我們回到基礎 - HTTP狀態代碼。有跡象表明,你有興趣談論身份驗證和授權時,在兩個主要的代碼 - 從RFC 7235規格的401和403

3.1。 401未授權(https://tools.ietf.org/html/rfc7235#section-3.1

401(未經授權)狀態代碼表示該請求已 沒有被應用,因爲它缺乏有效認證證書 爲目標的資源。

6.5.3。 403禁止(https://tools.ietf.org/html/rfc7231#section-6.5.3

的403(禁止)狀態代碼表示該服務器理解 請求,但拒絕授權。希望公開 爲什麼請求被禁止的服務器可以在響應 有效載荷(如果有)中描述該原因。

換句話說,401表示認證存在問題(用戶未通過身份驗證或未通過身份驗證)。可以提供有效的憑據並再次嘗試。同時,403意味着有權限問題。服務器知道用戶是誰,但拒絕訪問 - 不應該再次嘗試使用相同的憑據。

OWIN CookieAuthentication就在那裏,並偵聽返回的401錯誤代碼。如果它檢測到這樣的代碼,則將響應替換爲重定向到登錄頁面以維護返回地址。

儘管有AuthorizeAttribute的名稱,它實際上會生成401個狀態碼。 https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Http/AuthorizeAttribute.cs#L155

因此,用戶被帶到登錄頁面。

如果你想改變它,你可能需要實現你自己的AuthorizeAttribute。然後你可以檢查用戶是否已經登錄並返回403狀態。如果用戶還沒有登錄,只需返回401.

+0

感謝您的評論。這正是我爲了你提到的原因而做的事情:http specs。問題似乎實際上是AuthorizeAttribute解釋爲401.很難理解背後的原因,但我想我們必須忍受它。標記你的答案,因爲它給這個話題帶來了完全的清晰。 –

相關問題