[英]Authorization and ASP.NET MVC Caching
我對ASP.NET MVC緩存和授權感到困惑,並且急需一些澄清。
我的自制授權屬性繼承自AuthorizeAttribute
。 即使我在控制器操作上設置了[OutputCache]
屬性,它每次都會運行其重寫的AuthorizeCore
方法。 我明白那一部分。
現在讓我心煩意亂:當我實際執行輸出緩存並且頁面是從緩存提供時, AuthorizeCore
每次都會失敗 。 其原因是,當請求被高速緩存,該httpContext.Session
與供應AuthorizeCore
是null
!? 這是一些簡化的代碼:
protected override bool AuthorizeCore(HttpContextBase httpContext) {
return (Session["userId"] != null)
}
因此,如果httpContext.Session
為null
,則每次都會失敗。 我需要訪問會話,我還能如何檢查請求是否被授權? 這沒有任何意義 - 如果這是它應該如何,那么我永遠不能在ASP.NET MVC中使用緩存頁面和身份驗證。 救命?
有兩個不同的問題:
答案分別是肯定和否定。 身份驗證適用於緩存。 嘗試使用SQL或域成員資格提供程序; 你會看到的。
但是,緩存可以在身份驗證模塊之前運行。 (對於獎勵積分:為什么?)只有在專門掛鈎緩存時才會調用身份驗證(如AuthorizeAttribute所做的那樣)。 由於會話是特定於用戶的,因此無法保證您在AuthorizeCore中有會話。
更多獎勵積分:如果您在緩存配置中指定了varyByUser,這會如何變化?
不幸的是,正確進行身份驗證很難,因為做任何類型的安全權都很難。 Microsoft嘗試使用成員資格提供程序API使這更容易。 我強烈建議在實現自定義身份驗證時使用它 。 我還建議使用內置提供程序並擴展它們,而不是盡可能重寫它們。
另一點:ASP.NET會話提供程序和ASP.NET成員資格提供程序是完全獨立的。 不同的成員資格用戶可以共享(!)會話, 是的 ,您可以通過這種方式攻擊網站。 在會話中放置與安全相關的信息永遠不安全。 安全很難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.