Пользовательский атрибут || Запретить доступ к определенному 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);
}
}