ASP MVC Авторизовывает все действия кроме некоторых

Настройка отладки, поэтому вы видите значения strpos. Если отладка не может быть организована, чем vardump $ line и $ string. Вы, вероятно, получите неожиданные значения. Также старайтесь избегать проблем с типизацией. Возможно, это будет работать лучше.

if (strpos($line,$string) != false){...}else{...}
27
задан Craig 23 April 2009 в 05:51
поделиться

2 ответа

Ok, this is what I did. If there is a better way let me know.

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();
        }
    }
}
39
ответ дан 28 November 2019 в 04:10
поделиться

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

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
ответ дан 28 November 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: