使用ActionFilter禁止除特定页面以外的所有页面

时间:2011-10-03 18:13:23

标签: c# asp.net-mvc

我有一个ActionFilter,它应用于我的基本控制器,它检查请求和会话中的某些内容,并确保允许您查看请求的URI。

直到现在我们需要禁止所有页面(如今存在)但在这里和那里允许一些URI时,这一点工作正常。

理想情况下,我会将属性应用于我们想要允许的属性,然后在过滤器中检查该属性并允许它是否存在,但我无法弄清楚如何在过滤器中实现这一点。

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:0)

我花了一个多小时试图解决这个问题然后我在这里发布了SO。几分钟后,它袭击了我。

首先,我创建了一个属性

public class AlwaysAllowAnonymousAttribute : Attribute {}

其次,我用上面的属性

标记了我的动作或控制器

最后,在我的ActionFilter中,我做了这个

public class VerifyResourceAccess : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {

        var actionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AlwaysAllowAnonymousAttribute), false);
        var controllerAttributes = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AlwaysAllowAnonymousAttribute), false);
        bool alwaysAllow = (actionAttributes.Length > 0) || (controllerAttributes.Length > 0);

        if (!alwaysAllow) {
            /* ... Some logic for checking if this user is allowed to access this resource  ... */
        }

        base.OnActionExecuting(filterContext);
    }
}

任何标有该属性的动作或控制器都将始终具有访问权限。