Настройка отладки, поэтому вы видите значения strpos. Если отладка не может быть организована, чем vardump $ line и $ string. Вы, вероятно, получите неожиданные значения. Также старайтесь избегать проблем с типизацией. Возможно, это будет работать лучше.
if (strpos($line,$string) != false){...}else{...}
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();
}
}
}
Вот что я бы сделал, аналогично ответу Крейга с парой изменений:
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, по крайней мере, потребует, чтобы пользователь вошел в систему.