Пользовательский атрибут || Запретить доступ к определенному URL-адресу по ключу в Web.Config

Моя задача здесь: я хочу исключить конкретный URL-адрес "Controller/Action" на основе определенного ключа в "Web.Config. Я попытался создать собственный атрибут фильтра, но обнаружил еще одну проблему, заключающуюся в том, что"OnActionExecuting вызывает бесконечный цикл ", и на самом деле меня убедило это решение " ASP.NET MVC 3 OnActionExecuting вызывает бесконечный цикл", но я до сих пор не могу найти решение.

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 ответ

Это происходит потому, что ключ имеет значение true, затем вы перенаправляете к тому же действию, и когда вызов одного и того же действия, атрибут будет вызываться снова, и это будет бесконечный цикл, поэтому при изменении логики не нужно ничего делать, когда его значение true, просто дайте ему перейти к базовой функции ниже - это полный пример для вашего кода. попытайся.

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);
    }
}
Другие вопросы по тегам