Переопределение контроллера AuthorizeAttribute только для одного действия - PullRequest
55 голосов
/ 15 января 2010

У меня есть контроллер, украшенный атрибутом AuthorizeAttribute. Контроллер содержит несколько действий, для которых требуется аутентификация, за исключением одного действия, требующего некоторой пользовательской аутентификации, предоставляемой CustomAuthorizeAttribute.

У меня вопрос, как только я добавил [Авторизовать] на уровне контроллера, могу ли я переопределить его (или удалить) с помощью [CustomAuthorize] всего одним действием? Или я должен удалить [Authorize] с уровня контроллера и добавить его отдельно для каждого другого действия?

Я просто прошу об удобстве, потому что я ленивый и не хочу украшать каждое действие с помощью AuthorizeAttribute.

[Authorize]
public class MyController : Controller {

  //requires authentication
  public ViewResult Admin() {
    return View();
  }

  //... a lot more actions requiring authentication

  //requires custom authentication
  [CustomAuthorize]  //never invoked as already failed at controller level
  public ViewResult Home() {
    return View();
  }

}

Ответы [ 4 ]

98 голосов
/ 19 сентября 2015

В MVC 5 вы можете переопределить авторизацию для любого действия, используя новый атрибут OverrideAuthorization. По сути, вы добавляете его к действию, конфигурация авторизации которого отличается от конфигурации, определенной в контроллере.

Вы делаете это так:

[OverrideAuthorization]
[Authorize(Roles = "Employee")]
public ActionResult List() { ... }

Больше информации на http://www.c -sharpcorner.com / UploadFile / ff2f08 / переопределения фильтров в Asp-Net-mvc-5 /

В ASP.NET Core 2.1 нет атрибута OverrideAuthorization, и единственное, что вы можете сделать, - это сделать действие анонимным, даже если это не контроллер. Больше информации на https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.1

Один из вариантов сделать это следующим образом:

[Authorize(Roles = "Admin,Employee")] // admin or employee
public class XController : Controller 
{
    [Authorize(Roles = "Admin")] // only admin
    public ActionResult ActionX() { ... }

    [AllowAnonymous] // anyone
    public ActionResult ActionX() { ... }
}
23 голосов
/ 15 января 2010

Вы можете изменить Порядок, в котором работают атрибуты (используя свойство Порядка), но я считаю, что в этом случае они все равно будут работать, если только один из них не генерирует результат с немедленным эффектом. Ключ заключается в том, чтобы наименьший ограничительный атрибут применялся на самом высоком уровне (класс) и становился более ограничительным для методов. Например, если вы хотите, чтобы действие Home было общедоступным, вам необходимо удалить атрибут Authorize из класса и применить его к каждому из других методов.

Если действие имеет тот же уровень вседозволенности, но имеет другой результат, изменение порядка может быть достаточным. Например, вы обычно перенаправляете на действие Logon, но для Home вы хотите перенаправить на действие About. В этом случае задайте атрибут класса Order=2 и атрибут действия Home Order=1.

12 голосов
/ 05 марта 2013

Спустя слишком много времени, я нашел решение. Вам необходимо украсить свой контроллер с помощью пользовательского атрибута AuthorizeAttribute.

public class OverridableAuthorize : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var action = filterContext.ActionDescriptor;
        if(action.IsDefined(typeof(IgnoreAuthorization), true)) return;

        var controller = action.ControllerDescriptor;
        if(controller.IsDefined(typeof(IgnoreAuthorization), true)) return;

        base.OnAuthorization(filterContext);
    }
}

Который может быть связан с AllowAnonymous в действии

[AllowAnonymous]
0 голосов
/ 05 апреля 2019

Все, что вам нужно для переопределения [Авторизовать] с контроллера, для определенное действие заключается в добавлении

[AllowAnonymous] 

к действию, которое вы не хотите авторизовать (затем добавьте свой настраиваемый атрибут при необходимости).

См. Комментарии / intellisense:

Представляет атрибут, который помечает контроллеры и действия для пропуска System.Web.Mvc.AuthorizeAttribute во время авторизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...