Les autorisations personnalisées dans le Web.API

ma compréhension de 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
demandé sur tom 2013-03-01 04:03:03

2 réponses

je ne suis pas d'accord avec l'Opposition à tout

autorisation est faite dans un filtre d'autorisation - qui signifie que vous dérivez du système.Web.Http.Autorizeattribute et implémenter la méthode IsAuthorized.

vous ne mettez pas en œuvre l'autorisation dans un filtre d'action normal parce qu'ils fonctionnent plus tard dans le pipeline que les filtres d'autorisation.

vous n'implémentez pas non plus l'authentification dans un filtre (comme Parser un JWT) - c'est fait encore plus tôt dans un point d'extensibilité appelé MessageHandler.

44
répondu leastprivilege 2013-03-01 08:33:12

la méthode que nous utilisons est un attribut personnalisé Apiauthorizate qui hérite du système.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
répondu Gareth Suarez 2013-03-01 14:42:15