自定义属性||阻止在Web.Config中访问密钥的特定URL baseld

时间:2017-04-20 09:23:05

标签: asp.net-mvc custom-attributes

我的任务:我想基于“Web.Config”中的特定键消除特定网址“Controller / Action” 我尝试制作自定义过滤器属性,但我发现另一个问题是“OnActionExecuting导致无限循环 “,实际上我对这个解决方案”ASP.NET MVC 3 OnActionExecuting causes infinite loop“深信不疑,但我仍然无法找到解决方案。

Web.Config:

<add key="Delegation" value="true" />

我的控制器:我检查登录用户是否已获得授权,然后检查此用户是否有资格使用此控制器。

[MyAuthorize("EdgeEngineGroups")]
[Edge.Models.FilterAttribute]

我的过滤类:

public class FilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string Delegation = "";
        Delegation = System.Configuration.ConfigurationManager.AppSettings["Delegation"].ToString();
        if (string.IsNullOrEmpty(Delegation) != null)
        {
            if(Delegation.ToLower() == "true")
            {
                var controllerName = filterContext.RouteData.Values["controller"];
                var actionName = filterContext.RouteData.Values["action"];

                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary{{ "controller", controllerName },
                                      { "action", actionName }

                                     });
            }
            else
            {
                filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary{{ "controller", "AccessDenied" },
                                      { "action", "NotFound" }

                                     });

            }
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary{{ "controller", "AccessDenied" },
                                      { "action", "NotFound" }

                                     });

        }
        base.OnActionExecuting(filterContext);
    }
}

当键为“false”时它正常工作,它会重定向到未找到的页面,但是当键为true时,它会重定向到我的控制器,但每次都会找到过滤器属性。

我想知道是否有办法解决此错误,或者是主要任务的其他解决方案。

1 个答案:

答案 0 :(得分:0)

它的发生原因当键为真然后你重定向到同一个动作,当同一个动作调用属性将再次调用它将会无限循环所以改变逻辑不需要做什么时候它的真实只是让它传递给下面的基函数是你的代码的完整示例。试试吧。

public class FilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string Delegation = "";
        Delegation = System.Configuration.ConfigurationManager.AppSettings["Delegation"].ToString();
            if(string.IsNullOrEmpty(Delegation) || Delegation.ToLower() == "false")
            {
                filterContext.Result = new RedirectToRouteResult(
        new RouteValueDictionary{{ "controller", "AccessDenied" },
                                  { "action", "NotFound" }

                                 });

            }
        base.OnActionExecuting(filterContext);
    }
}