Пользовательский атрибут не срабатывает

У меня есть проект с контроллерами MVC и Web API. Он использует аутентификацию Windows. Однако я хочу защитить определенное действие веб-API с помощью настраиваемого атрибута. Я создал следующее только для настройки основного потока (в конечном итоге он проверит IP-адрес пользователя):

using System.Web;
using System.Web.Http;
using System.Web.Http.Filters;

namespace UoB.People.UserInterface.Mvc.Filters
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class IPAuthorize : AuthorizationFilterAttribute
    {
        protected bool AuthorizeCore(HttpContextBase httpContext)
        {
            return true;
        }
    }
}

Я украсил свое действие веб-API вызовом этого атрибута. Проблема в том, что когда я запускаю свой код локально, код атрибута никогда не попадает. Действие есть. Это конкретное действие принадлежит контроллеру, который не использует проверку подлинности Windows.

Почему мой атрибут не вызывается? Его нужно где-то регистрировать? Есть ли конфликт, потому что мой проект содержит контроллеры MVC и Web API? Я где-то допустил простую ошибку?

Спасибо.


person James    schedule 12.09.2014    source источник


Ответы (2)


Вам необходимо зарегистрировать свой атрибут в RegisterGlobalFilters в вашем классе FilterConfig.cs.

Надеюсь это поможет.

person DSR    schedule 12.09.2014
comment
Нет, это зарегистрирует фильтр как глобальный, т.е. вызовет его для всех запросов. - person ondra; 13.01.2015

Наконец-то разобрался со своей проблемой. На самом деле мне нужно было переопределить OnAuthorization и AuthorizeCore. Следующий пример демонстрирует это:

public class IPAuthorize : AuthorizeAttribute
{
    public string AuthorisedIPs { get; set; }

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (AuthorizeCore((HttpContextBase)actionContext.Request.Properties["MS_HttpContext"]))
            return;

        base.HandleUnauthorizedRequest(actionContext);
    }

    protected bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Logic here.
    }
}

Надеюсь, это поможет, если у кого-то еще возникнут проблемы.

person James    schedule 15.09.2014