web-dev-qa-db-fra.com

L'attribut d'autorisation personnalisé ne fonctionne pas dans WebAPI

 public class CustomAuthorizeAttribute : AuthorizationFilterAttribute
 {  
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
       return true;// if my current user is authorised
    }
 }

Ci-dessus est ma classe CustomAuthorizeAttribute et

[CustomAuthorize] // both [CustomAuthorize] and [CustomAuthorizeAttribute ] I tried 
public class ProfileController : ApiController
{
   //My Code..
}

Quand j'appelle

http://localhost:1142/api/Profile 

Il ne tire pas CustomAuthorizeAttribute

Plus sur ma classe FilterConfig est comme ci-dessous

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {            
        filters.Add(new CustomAuthorizeAttribute());
    }
}

S'il vous plaît, aidez-moi si je manque quelque chose.

22
b_in_U
  1. Il semble que vous utilisiez un filtre MVC au lieu d'un filtre API Web. Il peut être détecté dans l'exemple car il utilise HttpContextBase. Utilisez plutôt le filtre du System.Web.Http.Filters espace de noms.
  2. Vous devez remplacer OnAuthorization ou OnAuthorizationAsync sur le filtre de l'API Web.
  3. Vous n'avez pas besoin d'enregistrer un filtre global et de décorer votre contrôleur avec. L'enregistrer le fera fonctionner pour tous les contrôleurs.

Code de filtre de l'API Web: https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http/Filters/AuthorizationFilterAttribute.cs

21
Yishai Galatzer

Votre attribut personnalisé doit hériter de System.Web.Http.Filters.AuthorizationFilterAttribute

et ça devrait ressembler à ça

using System.Web.Http.Controllers;
using System.Web.Http.Filters;
public class CustomAuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
{   
    public override bool AllowMultiple
    {
        get { return false; }
    }

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        //Perform your logic here
        base.OnAuthorization(actionContext);
    }
}
11
Toan Nguyen

Essayez avec ça.

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        return true;
    }
}
10
leskovar

Pour ajouter aux autres réponses que vous avez héritées de System.Web.Http.Filters.AuthorizationFilterAttribute, J'ai mis ceci dans ma méthode OnAuthorization pour m'assurer que l'utilisateur était connecté:

if (!actionContext.RequestContext.Principal.Identity.IsAuthenticated)
{
     // or whatever sort you want to do to end the execution of the request
     throw new HttpException(403, "Forbidden");
} 
0
Conner