web-dev-qa-db-fra.com

Autorisations personnalisées dans Web.API

Ma compréhension d'ASP.NET MVC est que pour les autorisations, je devrais utiliser quelque chose comme -

public class IPAuthorize : AuthorizeAttribute {

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

Mais dans l'API Web, il n'y a pas de AuthorizeCore(..).

Il y a OnAuthorization(..) et le conseil général pour MVC est de ne pas utiliser OnAuthorization(..).

Que dois-je utiliser pour les autorisations personnalisées dans l'API Web?

27
tom

Je ne suis pas du tout d'accord avec Oppositionnel -

L'autorisation est effectuée dans un filtre d'autorisation, ce qui signifie que vous dérivez de System.Web.Http.AuthorizeAttribute et implémentez la méthode IsAuthorized.

Vous n'implémentez pas d'autorisation dans un filtre d'action normal car ils s'exécutent plus tard dans le pipeline que les filtres d'autorisation.

Vous n'implémentez pas non plus l'authentification dans un filtre (comme l'analyse d'un JWT) - cela se fait encore plus tôt dans un point d'extensibilité appelé MessageHandler.

44
leastprivilege

La méthode que nous utilisons est un attribut ApiAuthorize personnalisé qui hérite de System.Web.Http.AuthorizeAttribute. par exemple:

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;
        }
    }
}
11
Gareth Suarez