0

J'ai une API Web pour consommer les données provenant de mobile Android. Cette API Web consommera le fichier multi-parties à partir des données de formulaire de la demande d'API Web. J'ai suivi l'article this pour archiver. Je voulais faire la validation d'accès personnalisée pour cette API Web, donc mis en œuvre un filtre pour valider la demande.Filtre d'action asynchrone personnalisé pour l'API Web 2

Je le filtre comme ci-dessous

public class CustAuthAsyncAttribute : ActionFilterAttribute 
{ 
    public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
    {    
     InternalOnExecutingAsync(actionContext); 
    } 
} 

La méthode interne comme ce

protected void InternalOnExecutingAsync(HttpActionContext actionContext) 
     { 
      var authValue = actionContext.Request.Headers; 

if (authValue.Contains("CustomAccessToken")) 
      {     
       string token = authValue.GetValues("CustomAccessToken").First(); 

       var result = // doing some decription 

       if (result != null) 
       {      
        bool validationResult = // validation with database 
        if (!validationResult) 
        {       
         actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
         { ReasonPhrase = "Invalid token" }; 
        }      
       } 
       else 
       { 
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
        { ReasonPhrase = "Invalid token" }; 
       } 
      } 
      else 
      { 
       actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
       { ReasonPhrase = "Unauthorized Request" };     
      } 

Ces implémentations fonctionnent très bien dans l'API Outils client (exemple: Postman) si la validation passe, permet demande à la méthode.

Postman Response screen shot

Ce ne fonctionne pas dans l'application mobile, disant que le message de réponse l'accès non autorisé. et ne permettant pas la demande à la méthode même les validations d'accès personnalisées sont passées.

Pour votre information: Cette méthode fonctionne bien dans le mobile sans filtre

Aidez-moi à obtenir cela fonctionne dans l'application mobile aussi.

Merci d'avance.

Répondre

0

Vous utilisez le mauvais type de filtre pour gérer l'accès. Vous devriez utiliser un filtre d'autorisation. De plus, vous ne pouvez pas avoir une méthode asynchrone pour autoriser. Vous devez faire attendre le client appelant pour l'autorisation. Cela peut provoquer les effets secondaires que vous rencontrez.

Je ne suis pas sûr que cela a un rapport avec le fait que c'est une application mobile, mais la phase d'autorisation est antérieure au traitement de la demande. Vérifiez que vous n'utilisez aucune autre forme d'autorisation dans votre projet.

Vous devriez mettre en œuvre un filtre d'autorisation en héritant AuthorizeAttribute et dominante méthode IsAuthorized(HttpActionContext actionContext):

public class CustAuthAsync : AuthorizeAttribute 
{ 
    public CustAuthAsync() 
    { 
     ///Some initialization if required. Otherwise, not necessary to declare the constructor.. 
    } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var authValue = actionContext.Request.Headers; 

     if (authValue.Contains("CustomAccessToken")) 
     { 
      string token = authValue.GetValues("CustomAccessToken").First(); 

      var result = // doing some decription 

      if (result != null) 
      { 
       return //database validation 
      } 
      else 
      { 
       return false; 
       //No need to create special unauthorized response. You should not hint the reason at this point. You can do this in the HandleUnauthorizedRequest method. 
      } 
     } 
     else 
     { 
      return false;//No need to create special unauthorized response. 
     } 
    } 
} 

Vous pouvez utiliser cet attribut pour décorer vos contrôleurs. Vous pouvez même passer un paramètre dans le constructeur pour un contrôle plus granulaire sur la gestion des accès, comme un rôle requis pour accéder au contrôleur.