2011-10-04 112 views
3

我想製作一個自定義的AuthorizeAttribute類,如下所述:Override Authorize Attribute in ASP.NET MVC是否可以將方法參數傳遞給該方法的屬性?

的訣竅是,被授權的用戶與否不僅僅取決於他正在執行什麼方法,但參數,以及:

[MyCustomAuthorize(id)] 
[HttpGet] 
public ActionResult File(Guid id) 
{ 

} 

基本上,用戶將被授權看到一些文件,但不是其他人,所以我想將ID傳遞給我的自定義授權屬性。但我似乎無法做到這一點,因爲名稱'id'不在範圍內。

我知道我可以做的邏輯,以確保用戶有權訪問該文件的方法開始,但我有幾種方法,都將需要這樣做,並且它會更清潔,如果我可以做它作爲[Authorize]屬性的一部分。

回答

1

不,這不是合法的C#。

但是,您可以訪問AuthorizeAttribute子類型中的RouteValues

內部,例如,OnAuthorization,你可以這樣做:

object id = filterContext.RouteData.Values["id"]; 

要小心,雖然。你真的需要知道你在這裏做什麼。認證,授權和緩存之間的交互非常複雜。

+0

嗯,我可能沒有資格在「真的知道我在做什麼」類別。你會建議我只是檢查他們是否有每個方法內的權限呢? – GendoIkari

+0

不一定。如果一個動作結果被緩存,當用戶執行一個GET時,它將不會執行*。因此,操作中的權限檢查將不會運行。通常,像角色提供商或AzMan這樣的現成解決方案最適合那些不想重新發明車輪的人。 –

-2

也許2011年的最後一個答案對該版本是正確的但是它是可能的。創建一個公共int(或任何你需要的)並使用它。例如:

public class RestrictToTemplateManagers : AuthorizeAttribute 
{ 
    public string GUID { get; set; } 
} 

[RestrictToTemplateManagers(GUID="ABC")] 
public class ImportTemplatesController : Controller 
{ 

} 
+0

除了您的答案仍然限制它基於靜態值,而不是傳遞到該方法。 –

相關問題