Подтвердить что ты не робот

ASP MVC Разрешить все действия, за исключением нескольких

У меня есть контроллер, и я хотел бы потребовать авторизацию для всех действий по умолчанию, кроме пары. Поэтому в приведенном ниже примере все действия должны требовать аутентификации, кроме Индекса. Я не хочу, чтобы украшать каждое действие с помощью Авторизованного, я просто хочу переопределить авторизацию по умолчанию при определенных обстоятельствах, вероятно, с помощью настраиваемого фильтра, такого как NotAuthorize.

[Authorize]
public class HomeController : BaseController
{
    [NotAuthorize]
    public ActionResult Index()
    {
        // This one wont
        return View();
    }

    public ActionResult About()
    {
        // This action will require authorization
        return View();
    }
}
4b9b3361

Ответ 1

Хорошо, это то, что я сделал. Если есть лучший способ, дайте мне знать.

public class NotAuthorizeAttribute : FilterAttribute
{
    // Does nothing, just used for decoration
}

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Check if this action has NotAuthorizeAttribute
        object[] attributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
        if (attributes.Any(a => a is NotAuthorizeAttribute)) return;

        // Must login
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

Ответ 2

Как насчет [AllowAnonymous]??

Ответ 4

Вот что я хотел бы сделать, подобно Крэйгу, ответив на пару изменений:

1) Создайте обычный атрибут, полученный из System.Attribute(нет необходимости выводить из FilterAttribute, поскольку вы не собираетесь использовать что-либо, что предоставляет FilterAttribute).

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

Attribute
    AuthorizationAttribute
         AuthorizationNotRequiredAttribute
         AuthorizationAdminUserRequiredAttribute
             AuthorizationSuperUserRequiredAttribute

2) В вашем BaseController переопределите метод OnAuthorization, а не метод OnActionExecuting:

protected override void OnAuthorization(AuthorizationContext filterContext)
{
    var authorizationAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<AuthorizationAttribute>();
    bool accountRequired = !authorizationAttributes.Any(aa => aa is AuthorizationNotRequiredAttribute);

Мне нравится подход к безопасности по умолчанию: даже если вы забудете указать атрибут в Action, он, по крайней мере, потребует входа пользователя в систему.

Ответ 6

Отметьте контроллер с помощью [Авторизовать]

[Авторизоваться] public class YourController: ApiController

Отметьте действия, которые вы хотите публиковать, с помощью

[AllowAnonymous]

Ответ 7

Немного поздно вечеринке, но в итоге я создал атрибут auth на уровне контроллера и атрибут auth на уровне Action и просто пропустил аутентификацию Controller, если у Action был свой собственный атрибут Auth. Смотрите код здесь:

https://gist.github.com/948822