2014-04-16 76 views
5

我一直在對保護我的MVC 5應用程序的最佳方式進行大量研究。MVC5身份驗證:每個控制器或基本控制器上的授權屬性

我們有一個Web.csproj與許多WebAPI控制器,還有一個MVC站點有兩個區域 - 一個用於管理員,然後是面向公衆的網站。

讀完this article which states that the Base Controller is best way之後,我決定採用這種方法。

但是,我個人並不確定使用基本控制器(see this stackoverflow answer爲我的一些推理)。所以,鑑於我正在使用MVC 5(ASP.Net身份和OWIN認證) - 任何人都可以闡明每種方法的優點和缺點嗎?

+0

本文沒有介紹如何使用全局過濾器?我相信基本控制器被推薦用於MVC 1和2 .... – dima

+0

@dima是的,你是對的......我在文章底部引用了下面的引用: 「讓我完全清楚這個。保證MVC應用程序唯一受支持的方式是擁有一個帶有[Authorize]屬性的基類,然後讓每個控制器類型都擁有該基類型的子類,任何其他方式都會打開一個安全漏洞。然而,我認爲在試圖通過Route Constraints獲得MVC應用程序的背景下是一個嚴重的「禁忌」。 – JTech

+0

他在某種程度上是正確的,只是它應該說全球過濾器....我不明白你爲什麼不利用全球過濾器的優勢,並使整個網站的安全,只允許匿名訪問某些像登錄,註冊等 – dima

回答

19

在MVC 5目前的做法是應用AuthorizeAttribute爲全局過濾器,並在App_Start \開拓與AllowAnonymousAttribute

所以各個操作/控制器FilterConfig.cs加上下面幾行:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     ... existing filters 

     // use the [AllowAnonymous] attribute to open up individual Actions/Controllers 
     filters.Add(new System.Web.Mvc.AuthorizeAttribute()); 
     filters.Add(new RequireHttpsAttribute()); 
    } 

注:的好辦法,我也加入了RequireHttpsAttribute與ASP.Net身份驗證的每個請求中攜帶的身份驗證cookie,它很容易受到中間人如果通過常規HTTP進行攻擊。

0

我總是使用基本的控制器,不僅僅是爲了驗證和授權更多的理由......

爲了讓您的問題,我們落得這樣做滾動自己的自定義授權與複雜的規則的屬性,所有的從AuthorizeAttribute繼承。它非常簡單,只需從給定的屬性繼承,然後覆蓋OnAuthorization和AuthorizeCore方法。

通常,我們的所有控制器都不允許基於我們的baseController類進行匿名訪問。從那裏它根據需要變得複雜。但對於像這樣的東西使用基類並在其基礎上構建總是有意義的。如果您需要快速地進行非常廣泛的系統更改,請將其放入baseClass中,然後就可以了。

相關問題