2011-06-16 42 views

回答

8

在ASP.NET MVC 3,你可以實現一個自定義的全球action filter provider

public class MyProvider : IFilterProvider 
{ 
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     var rd = controllerContext.RouteData; 
     var controller = rd.GetRequiredString("controller"); 
     if (string.Equals("admin", controller, StringComparison.OrdinalIgnoreCase) && 
      string.Equals("logon", actionDescriptor.ActionName)) 
     { 
      return Enumerable.Empty<Filter>(); 
     } 

     return new[] 
     { 
      new Filter(new AuthorizeAttribute(), FilterScope.Action, 0) 
     }; 
    } 
} 

可能在Application_Start註冊:如果您使用的是一些DI容器

FilterProviders.Providers.Add(new MyProvider()); 

現在如NInject例如,它支持filter binding syntax,這意味着您可以配置內核以基於上下文動態注入過濾器。

這種方法的優點是,現在沒有什麼控制器或動作被添加到您的應用程序=>它需要授權。

+0

我見過這樣的事情,但希望有一個「更好」的方式,將重命名生存動作/控制器等 – 2011-06-16 17:56:25

+1

@Danny Tuppeny,OK,然後裝點您的登錄動作與一些自定義屬性(而不是一個動作過濾器,一個簡單的自定義CLR屬性)和提供者的'GetFilters'實現查找'ActionDescriptor'中是否存在這個自定義屬性。由於此自定義屬性將僅應用於LogOn操作,因此將不會執行操作和控制器重命名。 – 2011-06-16 18:01:19

+0

這聽起來像一個更好的主意! :-) – 2011-06-16 18:06:36

4

按照您的建議,我會將登錄操作移至自己的控制器,並將[Authorize]特性應用於整個AdminController類。這是更清潔,將來更容易維護。

0

我平時做這樣的事情:

[Authorize] 
public abstract class AdminController : Controller 
{ 
} 

並繼承從W /命名約定:

public class UserAdminController : AdminController 
{ 
} 

VS:

public class UserController : Controller 
{ 
} 
0

爲此,您可以使用過濾器供應商。

Phill Haack wrote about it here

+0

也讀過,但感覺比擁有一個獨立的登錄控制器更笨重:( – 2011-06-16 17:57:12

2

另一種方式,你可以在web.config中<location>元素做到這一點。這裏有一個例子:

<location path="/Admin/LogOn"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 

    <location path="/Admin"> 
    <system.web> 
     <authorization> 
     <allow users="?" /> 
     <deny users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
+0

- 基於授權的應該永遠不會用在MVC應用程序中記住:你試圖保護的資源是控制器(或動作),而不是URL。MVC框架不保證以/ Admin開頭的URL是唯一的方法來打AdminController。 – Levi 2011-07-10 02:08:01

相關問題