Пользовательские авторизации в Web.API

Мое понимание ASP.NET MVC заключается в том, что для авторизации я должен использовать что-то вроде -

public class IPAuthorize : AuthorizeAttribute {

protected override bool AuthorizeCore(HttpContextBase httpContext) {
    //figure out if the ip is authorized 
    //and return true or false
}

Но в веб-API нет AuthorizeCore(..).

Существует OnAuthorization(..), а общий совет для MVC - не использовать OnAuthorization(..).

Что я должен использовать для пользовательских авторизаций в веб-API?

Ответ 1

Авторизация выполняется в фильтре авторизации - это означает, что вы наследуете от System.Web.Http.AuthorizeAttribute и реализуете метод IsAuthorized.

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

Вы также не реализуете аутентификацию в фильтре (например, при анализе JWT) - это делается еще раньше в точке расширения, называемой MessageHandler.

Ответ 2

Метод, которым мы используем, является обычным атрибутом ApiAuthorize, который наследуется от System.Web.Http.AuthorizeAttribute. например:

public class ApiAuthorizeAttribute : AuthorizeAttribute
{
    readonly CreditPointModelContext _ctx = new CreditPointModelContext();

    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if(Authorize(actionContext))
        {
            return;
        }
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
        throw new HttpResponseException(challengeMessage);

    }

    private bool Authorize(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        try
        {
            //boolean logic to determine if you are authorized.  
            //We check for a valid token in the request header or cookie.


        }
        catch (Exception)
        {
            return false;
        }
    }
}