簡體   English   中英

授權和ASP.NET MVC緩存

[英]Authorization and ASP.NET MVC Caching

我對ASP.NET MVC緩存和授權感到困惑,並且急需一些澄清。

我的自制授權屬性繼承自AuthorizeAttribute 即使我在控制器操作上設置了[OutputCache]屬性,它每次都會運行其重寫的AuthorizeCore方法。 我明白那一部分。

現在讓我心煩意亂:當我實際執行輸出緩存並且頁面是從緩存提供時, AuthorizeCore每次都會失敗 其原因是,當請求被高速緩存,該httpContext.Session與供應AuthorizeCorenull !? 這是一些簡化的代碼:

protected override bool AuthorizeCore(HttpContextBase httpContext) {
    return (Session["userId"] != null)
}

因此,如果httpContext.Sessionnull ,則每次都會失敗。 我需要訪問會話,我還能如何檢查請求是否被授權? 這沒有任何意義 - 如果這是它應該如何,那么我永遠不能在ASP.NET MVC中使用緩存頁面和身份驗證。 救命?

有兩個不同的問題:

  1. 身份驗證是否適用於MVC中的緩存?
  2. 在面向緩存的身份驗證之前,Session是否正常工作(即使是未經身份驗證的用戶,他們仍然希望有一個獨特的會話)?

答案分別是肯定和否定。 身份驗證適用於緩存。 嘗試使用SQL或域成員資格提供程序; 你會看到的。

但是,緩存可以在身份驗證模塊之前運行。 (對於獎勵積分:為什么?)只有在專門掛鈎緩存時才會調用身份驗證(如AuthorizeAttribute所做的那樣)。 由於會話是特定於用戶的,因此無法保證您在AuthorizeCore中有會話。

更多獎勵積分:如果您在緩存配置中指定了varyByUser,這會如何變化?

不幸的是,正確進行身份驗證很難,因為做任何類型的安全權都很難。 Microsoft嘗試使用成員資格提供程序API使這更容易。 我強烈建議在實現自定義身份驗證時使用它 我還建議使用內置提供程序並擴展它們,而不是盡可能重寫它們。

另一點:ASP.NET會話提供程序和ASP.NET成員資格提供程序是完全獨立的。 不同的成員資格用戶可以共享(!)會話, 是的 ,您可以通過這種方式攻擊網站。 在會話中放置與安全相關的信息永遠不安全。 安全很難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM