目前,我的上的所有方法都具有[Authorize]
屬性,但Logon
操作除外。保護除Controller(Login)之外的所有操作的最佳方式是什麼?
什麼是反轉這個乾淨的方式,所以我不記得要的屬性添加到所有方法,而是一個屬性只應該是可以不被記錄在方法(S)加?
我會更好只是將Logon
行動移動到其自己的控制器,並將[Authorize]
屬性應用到AdminController類?
目前,我的上的所有方法都具有[Authorize]
屬性,但Logon
操作除外。保護除Controller(Login)之外的所有操作的最佳方式是什麼?
什麼是反轉這個乾淨的方式,所以我不記得要的屬性添加到所有方法,而是一個屬性只應該是可以不被記錄在方法(S)加?
我會更好只是將Logon
行動移動到其自己的控制器,並將[Authorize]
屬性應用到AdminController類?
在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,這意味着您可以配置內核以基於上下文動態注入過濾器。
這種方法的優點是,現在沒有什麼控制器或動作被添加到您的應用程序=>它需要授權。
按照您的建議,我會將登錄操作移至自己的控制器,並將[Authorize]特性應用於整個AdminController類。這是更清潔,將來更容易維護。
我平時做這樣的事情:
[Authorize]
public abstract class AdminController : Controller
{
}
並繼承從W /命名約定:
public class UserAdminController : AdminController
{
}
VS:
public class UserController : Controller
{
}
另一種方式,你可以在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>
我見過這樣的事情,但希望有一個「更好」的方式,將重命名生存動作/控制器等 – 2011-06-16 17:56:25
@Danny Tuppeny,OK,然後裝點您的登錄動作與一些自定義屬性(而不是一個動作過濾器,一個簡單的自定義CLR屬性)和提供者的'GetFilters'實現查找'ActionDescriptor'中是否存在這個自定義屬性。由於此自定義屬性將僅應用於LogOn操作,因此將不會執行操作和控制器重命名。 – 2011-06-16 18:01:19
這聽起來像一個更好的主意! :-) – 2011-06-16 18:06:36