2016-07-29 54 views
0

如果這個問題有點偏離主題,讓我知道。 我會把它放在其他地方,但我想獲得一些關於如何在現有項目中完成某些工作的想法。是否可以在ASP.NET MVC&Identity 2.0中緩存授權?

我的web應用程序(使用ASP.NET MVC 5和ASP.NET Identity 2.0)通過自定義角色提供程序執行授權(通過那些花式的Authorize屬性)。 每個授權檢查(如Authorize(Roles = "Admin"))需要查詢數據庫執行以下操作:

  • 獲取當前「學期」(檢查當前的日期&時間落入什麼日期範圍)從Semesters
  • 獲取Positions表中名稱爲「Admin」的位置
  • 檢查Leaders表中是否存在包含當前用戶ID,獲取的學期ID和獲得的位置ID的記錄。

如果記錄存在,用戶被授權,否則他們是不會。 爲了清楚起見,爲了將相應的特權限制在一個學期的時間內,分配給一個學期與一個學期相關聯。 即,一旦學期結束時,用戶不再擁有自己的權力,但任命了下學期旁邊的人會立即獲得他們的。

我的大多數用戶都屬於那些在大多數他們所訪問的網頁的檢查,但並不是所有的角色。 所有這些步驟都執行,每次我需要授權。

這裏是數據庫的圖像只是要清楚: enter image description here

有沒有辦法緩存(這樣我就不必不斷地查詢數據庫),這些授權的時間長度相當於從第一次執行檢查/緩存到學期結束的時間? 或者只是將它們緩存在合理的任何時間量? 理想的情況下,如果一個學期或位置無論出於何種原因更新的授權會以某種方式被視爲無效,重新緩存。 最後,一個自定義的RoleProvider是一個堅實的方法來解決這個問題?

回答

1

我會小心緩存的授權,本身。您希望保持靈活性,並且無需仔細設計,您可以輕鬆地在您的應用程序中插入安全漏洞。

但是,您爲獲取用於進行授權確定的信息所做的查詢可能會被緩存。爲此,我建議使用MemoryCache。簡單地說:

ObjectCache cache = MemoryCache.Default; 

... 

var foos = cache.Get("key") as List<Foo>; 
if (foos == null) 
{ 
    foos = repo.GetFoos(); 
    cache.Add("key", foos, new CacheItemPolicy 
    { 
     AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) 
    }); 
} 

// do something with `foos` 

這基本上它是如何工作的,但在這樣的網絡環境中,你需要考慮併發性。我寫了一個post on my blog,它提供了一個擴展,使處理更容易。

2

是否有緩存(這樣我就不必不斷地查詢 數據庫),這些授權時間相當於 時間從時,首先進行檢查長度的方式/緩存到 學期結束了嗎?

默認情況下,ASP.Net身份存儲用戶的角色聲明後用戶成功登錄內部授權的角色。這些聲明存儲在cookie內部,直到用戶註銷或關閉瀏覽器。

這是不值得實施的授權屬性附加緩存。

+1

值得注意的是,從安全角度來看,這些細節並不是以明文形式存儲的。它們以加密方式存儲,如ASP.NET_SessionId = fegias ...; .AspNet.ApplicationCookie = QPHpjno5QPgbpt ... –