如果我的所有.Net控制器/动作都需要授权Attr,为什么没有属性只能使用那些不需要的人?

Aca*_*uza 2 .net c# asp.net asp.net-mvc asp.net-mvc-3

我有一个需要授权才能访问所有控制器/操作的应用程序.登录错误控制器/操作除外.

在这种情况下,以防御方式工作最好是保持对所有控制器/操作的默认限制访问(没有授权属性),并且只选择那些不使用自定义属性的自定义属性.

你们这样做过吗?

我有一个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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在想最好的方法.我可以创建一个空白自定义属性并放入控制器不需要授权并在我的过滤器中检查它:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你认为你的专家是什么?

更新:

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

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyCustomAuthorizeAttribute());
}
Run Code Online (Sandbox Code Playgroud)

更新2:

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

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new ValidatePermissionAttribute("Login", "Erro"));
}
Run Code Online (Sandbox Code Playgroud)

我的授权属性:

public class ValidatePermissionAttribute : AuthorizeAttribute
{
    ...

    public ValidatePermissionAttribute(params string[] optionalControllers)
    {
        _optionalControllers = optionalControllers;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

更新3:

条件过滤器可行的方法.

Bri*_*ins 6

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

在使用过滤器属性的问题之前我被告知,结果可以通过输出缓存进行缓存,然后这不会运行.最好实现IAuthorizationFilter接口(或AuthorizeAttribute类)并改为创建授权过滤器.

  • @Acaz,如果你的意思是'GlobalFilters.Filters.Add(new MyActionFilterAttribute());`,那就是这个答案所暗示的. (3认同)