У меня есть приложение, которое требует авторизации для доступа ко всем Контроллерам / Действиям . За исключением входа в систему и ошибок контроллеров / действий .
В этом сценарии лучше работать с защитой, чтобы по умолчанию ограничить доступ ко всем Контроллерам / действиям (без атрибута авторизации) и выбирать с пользовательским атрибутом только тех, кто этого не делает.
Вы, ребята, сделали что-то подобное?
У меня есть MVC Filter , который выполняется перед всеми действиями, если Зарегистрированный пользователь имеет к ним доступ:
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);
}
}
}
Я думаю, что лучший способ сделать это. Я могу создать Blank Custom Attribute и поместить в контроллеры, не нуждающиеся в авторизации, и проверить это в моем Filter :
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);
}
}
}
Что вы, эксперты, ребята думаете?
Обновление:
Думая лучше, я могу заменить мой Фильтр на Настраиваемый атрибут авторизации и зарегистрировать его, чтобы он действовал во всех Контроллерах / Действиях в Global. asax
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyCustomAuthorizeAttribute());
}
Обновление 2:
Вместо этого создайте Blank Custom Attribute и вставьте в контроллеры, не требуется авторизация. Я передаю параметры моей пользовательской авторизации. Контроллеры не нуждаются в авторизации (в Global.asax):
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ValidatePermissionAttribute("Login", "Erro"));
}
Мой атрибут авторизации:
public class ValidatePermissionAttribute : AuthorizeAttribute
{
...
public ValidatePermissionAttribute(params string[] optionalControllers)
{
_optionalControllers = optionalControllers;
}
...
}
Обновление 3:
Условные фильтры - путь.