web-dev-qa-db-fra.com

code d'état de retour Non autorisé pour le filtre d'action personnalisé dans l'API Web.

Je travaille avec asp.net WebAPI et j'ai besoin de créer un ActionFilter personnalisé qui vérifie rapidement si l'utilisateur qui demande l'URI doit réellement pouvoir récupérer les données. 

Ils ont déjà été autorisés à utiliser le service Web via une autorisation de base et leur rôle a été validé via un fournisseur de rôle personnalisé.

La dernière chose que je dois faire est de vérifier qu’ils sont autorisés à afficher les données demandées avec un paramètre dans leur URI.

Voici mon code:

public class AccessActionFilter : FilterAttribute, IActionFilter
    {

        public System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>> continuation)
        {

            var result = //code to see if they have permission returns either 0 or 1

            if (result==0) {
               throw new ArgumentException("You do not have access to this resource");
            }
            return continuation();
        }
    } 

Actuellement, je lance juste une erreur qui n’est pas ce que je veux, je préférerais renvoyer System.Net.HttpStatusCode.Unauthorized mais je suis un peu vexé par la méthode que j’ai utilisée et que je ne comprends pas vraiment.

Comment pourrais-je m'y prendre pour renvoyer cette valeur?

21
Slee

Vous feriez probablement mieux de vous en tenir à une exception, mais en utilisant l’exception HttpResponseException qui renverra également un code d’état Http.

throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));

Bonne question ici à ce sujet.

p.s.

Il peut être plus simple/plus propre à implémenter ActionFilterAttribute

public class AccessActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var result = //code to see if they have permission returns either 0 or 1

        if (result==0) 
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
        }
        base.OnActionExecuting(actionContext);
    }

}

29
Mark Jones

Au lieu de lancer une exception, vous pouvez définir le code d'état

public class ExecutionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var result = 0;//code to see if they have permission returns either 0 or 1

        if (result == 0)
        {
            actionContext.Response = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.Unauthorized,
                Content = new StringContent("Unauthorized User")
            };
        }
        base.OnActionExecuting(actionContext);
    }
}
0
Akhilesh Kamate