2016-10-11 126 views
0

當我們擴展Authorize屬性時,我在理解Authorization如何在MVC中工作時遇到了一些問題。自定義MVC授權如何工作?

所以在代碼中,我們擴展了AuthorizeAttribute這樣的:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public class AuthExtendAttribute : AuthorizeAttribute 

我們再添加擴展到全局過濾器的這樣的名單:

filters.Add(new AuthExtendAttribute()); 

然後操作方法裝飾與這樣的授權屬性:

[Authorize] 
public bool DoStuff() 

我的問題是,將t他的新擴展替換默認行爲[Authorize]屬性或將框架仍使用默認行爲,然後調用AuthExtendAttribute中的重寫方法?

另外,爲什麼我需要擴展添加到全局過濾器列表中,如果我可以簡單地裝飾與[AuthExtend]我的操作方法?

對於較新的MVC應用程序,我們不應該擴展授權屬性,而是我們應該使用新的基於策略的授權,這也是事實嗎?

回答

1

你有兩個獨立的動作過濾器。通過將新過濾器註冊爲全局過濾器,您只需將其用於應用中的所有操作即可。

隨着您的原始設置,兩個過濾器將執行。如果你想控制它們被執行的順序,你可以看看Order和Scope屬性;更多資訊:In what order are filters executed in asp.net mvc

另外,爲什麼我需要擴展添加到全局過濾器列表中,如果我可以簡單地裝飾我的操作方法與[AuthExtend]?

這取決於你想要做什麼。您的全局過濾器將執行所有操作。通常,您只會使用擴展屬性,我不明白爲什麼要使用這兩個屬性。 不確定您的自定義過濾器是如何實現的以及您的身份驗證如何設置,但是過濾器全局註冊了用戶如何登錄(因爲他們需要被授權訪問登錄頁面)?

我認爲如果您只是使用自定義過濾器並根據需要將其添加到控制器和/或操作的頂部,那將是最好的。

對於較新的MVC應用程序,我們不應該擴展Authorize屬性,而應該使用新的基於策略的授權,這也是事實嗎?

我不認爲基於策略的授權和創建自定義操作過濾器是相互排斥的。

1
  1. 不,默認行爲將保持不變,未經授權的請求將被重定向到登錄。

  2. 爲了在整個應用程序中使用該屬性,您需要註冊過濾器,這就是將它添加到全局過濾器列表時發生的情況。

  3. 不確定對於這個問題有一個激動人心的答案,海事組織應該根據您的要求而不是規則作出決定。根據我的經驗,即使基於聲明/角色的授權可以在系統具有不同角色時簡化事務,並且可以基於角色訪問應用程序的某些部分。但是在單個或少數用戶情況下,使用自定義授權總是很快。