2009-08-06 56 views
0

讓我們假設我不想使用成員資格並希望用ActionFilter限制用戶的訪問。在ASP.NET MVC中檢查用戶的詳細信息ActionFilter

我知道我可以創建一個過濾器/屬性並重寫OnActionExecuting方法,並且我可以將此屬性放在ActionResult中。

讓我們假設我有一個名爲'tbUsers'的表,它也有一個名爲'certificate'的int字段,根據這個'certificate'值,用戶可以訪問一個ActionResult或不。

但是,如何在OnActionExecuting mehod中檢查此用戶的「證書」值並授予他的訪問權限或重定向到「NotAllowed.aspx」頁面?

謝謝!

回答

1

ActionExecutingContext具有包含當前User對象的HttpContext。你可以使用它來獲取用戶。如果您想將信息存儲在會話中,您也可以使用它來訪問會話。您也可以將其放入加密的cookie中,並通過上下文中的Request.Cookies訪問它們。你可能想考慮一下安全問題,儘管我認爲它比auth cookie更麻煩。

根據數據庫檢查它並保持過濾器的可測試性要稍微複雜一些。我所做的是爲每個過濾器類提供兩個構造函數。一個提供了一個數據庫工廠,將創建我的數據上下文。我使用它來測試並提供一個模擬數據庫工廠,生成一個模擬或假數據庫。普通的,無參數的構造函數使用空工廠調用前面的構造函數。發生這種情況時,其他構造函數將創建默認工廠的新實例。

private IDatabaseFactory Factory { get; set; } 
public MyFilter(IDatabaseFactory factory) 
{ 
    this.Factory = factory ?? new DefaultDatabaseFactory(); 
} 

public MyFilter() : this(null) { } 
4

我不會這樣做。我會執行一個IAuthorizationFilter。授權過濾器在所有操作過濾器之前運行。

例如,假設您稍後在操作方法上放置了OutputCache屬性,並且它恰好在您的驗證過濾器之前運行。那會很糟糕!如果內容被緩存,認證過濾器將永遠不會運行,並且人們會看到緩存的敏感數據。