web-dev-qa-db-fra.com

Autorisation d'API Web ASP.NET avec AuthorizeAttribute

Utilisation de la nouvelle version bêta de l’API Web ASP.NET. Je n'arrive pas à obtenir la méthode suggérée d'authentification des utilisateurs, au travail. Où l'approche suggérée semble être, ajouter le filtre [Authorize] aux contrôleurs d'API. Par exemple:

[Authorize] 
public IEnumerable<Item> Get()
{
    return itemsService.GetItems();
}

Cela ne fonctionne pas comme prévu cependant. Lorsque vous demandez la ressource, vous êtes redirigé vers un formulaire de connexion. Ce qui n'est pas très approprié pour un webapi RESTful. 

Comment dois-je procéder avec cela? Cela fonctionnera-t-il différemment dans les versions futures ?, ou devrais-je me résoudre à appliquer mon propre filtre d'action?

59
Morgan Bengtsson

Vérifiez que vous utilisez le System.Web.Http.AuthorizeAttribute et non le System.Web.Mvc.AuthorizeAttribute. Cela m'a mordu avant. Je sais que l’équipe WebAPI tente de tout rassembler pour que les utilisateurs de MVC soient au courant, mais je pense que certaines choses sont inutilement déroutantes.

93
AlexGad

Définissez votre mode d’authentification sur Aucun:

<authentication mode="None" />

Aucun Spécifie aucune authentification. Votre application n'attend que des utilisateurs anonymes ou fournit sa propre authentification.

http://msdn.Microsoft.com/en-us/library/532aee0e.aspx

Bien sûr, vous devez alors fournir une sorte d'authentification via des en-têtes, des jetons ou quelque chose du genre. Vous pouvez également spécifier Windows et utiliser l’authentification intégrée via les en-têtes.

Si ce site est mélangé entre l'API et les pages réelles qui nécessitent le paramètre Forms, vous devrez écrire votre propre traitement.

Tout l'attribut renvoie une instance HttpUnauthorizedResult, la redirection se faisant en dehors de l'attribut, le problème n'est donc pas celui de votre fournisseur d'authentification.

4
Paul Tyng

Enfin, j'ai trouvé une solution sur: Autorisation ASP.NET MVC 4 WebAPI

Cet article montre comment résoudre ce problème. 

3
Malkov

Vous êtes redirigé vers la page de connexion car le module d'authentification par formulaire le fait automatiquement. Pour vous débarrasser de ce comportement, désactivez l'authentification par formulaire, comme le suggère Paul . Si vous souhaitez utiliser une approche plus conviviale REST, envisagez de mettre en œuvre le support d'autorisation HTTP . Jetez un coup d'œil à cet article de blog http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/

2
adrin

ASP.NET 5 Introduction du nouveau système Microsoft.AspNet.Authorization qui peut sécuriser les contrôleurs deux MVC et Web API.

Pour plus voir ma réponse liée ici.

Mettre à jour:

Il y a 2 ans, c'était Microsoft.AspNetCore.Authorization.

Comme @Chris Haines l'a souligné. il réside maintenant sur Microsoft.AspNetCore.Authorization.

De .NET core 1.0 à 2.0, de nombreux espaces de noms ont été déplacés, je pense… et les fonctionnalités partagées entre .net classic et core étaient obscures. C'est pourquoi Microsoft a introduit le standard .net. 

.net standard

1
Anestis Kivranoglou

Regardez aussi ma réponse pour: Comment sécuriser une API Web ASP.NET

J'ai créé un package NuGet que vous pouvez utiliser par commodité.

0
Varun Chatterji

Si vous utilisez un rôle, assurez-vous de l'orthographier correctement:

Si votre rôle s'appelle 'Administrateur', alors ceci - par exemple ne fonctionnera pas:

    [System.Web.Http.Authorize(Roles = "Administator")]

Ceci non plus:

    [System.Web.Http.Authorize(Roles = "Administrators")]

Oops...

0
Simon_Weaver
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Produces("application/json")]
[Route("api/[controller]")]
public class CitiesController : Controller
{
        [HttpGet("[action]")]
        public IActionResult Get(long cityId) => Ok(Mapper.Map<City, CityDTO>(director.UnitOfWork.Cities.Get(cityId)));
}

Utilisation

[Authorize (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

Filtre avec type d'authentification

0