2011-09-19 10 views
2

我有一个应用程序需要授权才能访问所有控制器/操作。除了登录错误控制器/操作如果我所有的.Net控制器/操作都需要授权Attr,为什么没有一个属性只能使用那些不需要的?

在这种情况下,在一次防守方式工作是更好地保持默认限制对所有控制器/操作(无授权属性)和一个自定义选择属性只有那些谁不知道。

你们这样做过吗?

我有一个MVC过滤如果登录的用户有机会获得他们的所有行动之前执行:

public class ValidatePermissionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     bool isAuthorized = false; 

     //Logic that verify if logged user have permission to access the requested Controller/Action 
     ... 

     //Redirect to a page Error if Logged User don't have Authorization 
     if (!isAuthorized) 
     { 
      RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
      redirectTargetDictionary.Add("action", "Erro"); 
      redirectTargetDictionary.Add("controller", "Index"); 

      context.Result = new RedirectToRouteResult(redirectTargetDictionary); 
     } 
    } 
} 

我想做到这一点的最好办法。我可以创建一个空白定制属性及放在控制器不需要授权,并检查它在我过滤

public class ValidatePermissionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     bool isAuthorized = false; 

     var DoNotRequiresAuthorizationAttributes = context.ActionDescriptor.GetCustomAttributes(typeof(DoNotRequiresAuthorizationAttribute), false); 

     if (DoNotRequiresAuthorizationAttributes.Length > 0) 
      isAuthorized = true; 

     ... 

     //Redirect to a page Error if Logged User don't have Authorization 
     if (!isAuthorized) 
     { 
      RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
      redirectTargetDictionary.Add("action", "Erro"); 
      redirectTargetDictionary.Add("controller", "Index"); 

      context.Result = new RedirectToRouteResult(redirectTargetDictionary); 
     } 
    } 
} 

什么各位高手你们认为?

更新:

思考更好,我可以在Global.asax中取代我筛选自定义授权属性并注册在所有控制器ACT /动作

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new MyCustomAuthorizeAttribute()); 
} 

更新2:

而是创建一个空白定制属性及放在控制器不需要授权,我通过我的自定义授权参数的控制器不需要授权(在Global.asax中):

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new ValidatePermissionAttribute("Login", "Erro")); 
} 

我授权属性:

​​

更新3:

条件筛选器是要走的路。

+0

我喜欢这个方法...... – David

+0

@David,全局和条件过滤器是标准的方法。 :) – bzlm

+0

不,srsly ?! :-X – David

回答

2

如果目标只是减少需要重新申报在许多地方的属性,似乎人们可以通过属性创建一个抽象AuthorizeController达到同样的,任何控制他们的行动都需要授权可以继承。

6

几种方式来处理属性的批量实现:

我一直在发行前向使用的过滤器属性,其结果可以通过输出缓存缓存,然后这个止跌不会跑。最好实现一个IAuthorizationFilter接口(或AuthorizeAttribute类),然后创建一个授权过滤器。

+1

而不是创建自定义控制器基类我可以在Global.asax中注册我的属性。你怎么看? –

+3

@Acaz,如果你的意思是'GlobalFilters.Filters.Add(new MyActionFilterAttribute());',那么这就是这个答案所暗示的。 – bzlm

+0

@Acaz是的,应该很适合你在全球范围内应用。 –

相关问题