web-dev-qa-db-fra.com

Appliquer implicitement l'attribut [Autoriser] à tous les contrôleurs d'API Web

Mon application est configurée où toutes les demandes, sauf la connexion, doivent être "autorisées" à l'aide de l'attribut d'autorisation dans l'API Web. Par exemple.

 [Authorize]
 [HttpGet, Route("api/account/profile")]
 public ApplicationUser Profile()
 {
       return userModel;
 }

et seule la connexion ne doit pas autoriser car c'est là que vous obtenez le jeton;)

[AllowAnonymous]
[HttpPost, Route("api/account/login")]
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
   ....
}

au lieu d'avoir à ajouter le [Authorize] attribut à TOUS mes itinéraires, existe-t-il un moyen de le définir globalement?

26
amcdnl

Vous avez deux options

  1. Niveau contrôleur en décorant votre contrôleur avec l'attribut authorize.

    [Authorize]
    [RoutePrefix("api/account")]
    public class AccountController : ApiController
    {
    
  2. Vous pouvez également le définir au niveau global pour toutes les routes, dans la méthode Register du fichier WebApiConfig.cs

     config.Filters.Add(new AuthorizeAttribute());
    
49
ssilas777

Vous pouvez définir le AuthorizeAttribute dans le fichier WebApiConfig comme ci-dessous:

public static void Register(HttpConfiguration config)
{
  config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
  );
  config.Filters.Add(new AuthorizeAttribute());
}

Désormais, toutes les méthodes de vos contrôleurs Web Api devront être autorisées. Si vous souhaitez supprimer cette autorisation pour une méthode, vous devez ajouter l'attribut [AllowAnonymous] comme dans la méthode d'action de connexion.

21
Lin

Je voulais juste ajouter quelque chose à d'autres réponses que si vous utilisez

 filters.Add(container.Resolve<AuthorizeAttribute>());

vous pouvez également injecter toutes les dépendances dans votre attribut en cas de besoin

1
samira riazati