web-dev-qa-db-fra.com

Autoriser l'attribut dans ASP.NET MVC

J'ai du mal à comprendre l'utilisation réelle de l'attribut [Authorize] dans ASP.NET MVC. Selon le concept, si nous décorons une méthode de contrôleur avec l'attribut [Authorize], seuls les utilisateurs authentifiés sont autorisés à accéder aux contrôleurs. 

J'ai développé une application ASP.NET MVC sans décorer les contrôleurs avec l'attribut [Authorize]. Ce que j’ai observé, c’est que, si j’implémente correctement le mécanisme d’authentification dans mon application en utilisant web.config ou d’une autre manière, je peux maintenant accéder à l’URL {controller}/{action}/{id} d’une méthode d’action donnée. 

Le système demande toujours une connexion. Cela signifie que mes contrôleurs sont sécurisés. Ma question est la suivante: lorsque je peux sécuriser mes contrôleurs sans utiliser l'attribut [Authorize], quel est alors le réel besoin?

50
techmad

Le véritable pouvoir vient avec la compréhension et l'implémentation du fournisseur d'appartenance ainsi que du fournisseur de rôle. Vous pouvez affecter des utilisateurs à des rôles et, selon cette restriction, vous pouvez appliquer différents rôles d'accès pour différents utilisateurs aux actions du contrôleur ou au contrôleur lui-même. 

 [Authorize(Users = "Betty, Johnny")]
 public ActionResult SpecificUserOnly()
 {
     return View();
 }

ou vous pouvez restreindre selon le groupe 

[Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
    return View();
}
82
BobRock

L'utilisation d'attributs [Authorize] permet d'éviter des failles de sécurité dans votre application. La manière dont MVC gère les URL (c'est-à-dire en les routant vers un contrôleur plutôt que vers un fichier réel) rend difficile la sécurisation de l'ensemble via le fichier web.config.

Lisez plus ici: http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous- attribut.aspx

13
Alex Vallejo

Il existe parce qu'il est plus pratique à utiliser. De plus, il s'agit d'une idéologie totalement différente qui utilise des attributs pour marquer les paramètres d'autorisation plutôt que la configuration xml. Il ne s'agissait pas de vaincre la configuration générale ou tout autre cadre d'autorisation, mais simplement la manière de procéder de MVC. Je dis cela, car il semble que vous recherchiez une fonctionnalité technique qui présente des avantages qui ne sont probablement pas ... tout simplement super pratiques.

BobRock a déjà énuméré les avantages. Juste pour ajouter à sa réponse, un autre scénario est que vous pouvez appliquer cet attribut à l’ensemble du contrôleur, pas seulement aux actions, mais vous pouvez également ajouter différents paramètres d’autorisation de rôle à différentes actions d’un même contrôleur. 

10
m0s

L’utilisation de l’attribut Authorize semble plus pratique et donne plus d’impression de «façon MVC». En ce qui concerne les avantages techniques, il y en a.

Un scénario qui me vient à l’esprit est celui de l’utilisation de la mise en cache de sortie dans votre application. Authorize attribue bien cela.

Une autre serait l'extensibilité. L'attribut Authorize est simplement un filtre de base prêt à l'emploi, mais vous pouvez remplacer ses méthodes et effectuer certaines opérations de préautorisation, telles que la journalisation, etc.

8
frennky

L’un des avantages est que vous compilez l’accès dans l’application afin qu’il ne puisse pas être modifié accidentellement par une personne qui modifie Web.config. 

Cela peut ne pas être un avantage pour vous et pourrait être un désavantage. Mais pour certains types d'accès, cela peut être préférable.

De plus, je trouve que les informations d'autorisation dans le fichier Web.config le polluent et compliquent la recherche d'informations. Donc, à certains égards, sa préférence, à d'autres, il n'y a pas d'autre moyen de le faire.

4
Erik Funkenbusch

La balise dans web.config est basée sur les chemins, alors que MVC fonctionne avec les actions et les routes du contrôleur. 

C’est une décision architecturale qui ne fera peut-être pas beaucoup de différence si vous voulez simplement empêcher les utilisateurs qui ne sont pas connectés, mais qui fait beaucoup de différence lorsque vous essayez d’appliquer une autorisation basée sur Roles et dans les cas où vous souhaitez un traitement personnalisé types de non autorisés.

Le premier cas est couvert par la réponse de BobRock. 

L'utilisateur doit avoir au moins l'un des rôles suivants pour accéder au contrôleur ou à l'action.

[Authorize(Roles = "Admin, Super User")]

L'utilisateur doit avoir ces deux rôles pour pouvoir accéder au contrôleur ou à l'action.

[Authorize(Roles = "Super User")]
[Authorize(Roles = "Admin")]

Les utilisateurs pouvant accéder au contrôleur ou à l'action sont Betty et Johnny.

[Authorize(Users = "Betty, Johnny")]

Dans ASP.NET Core, vous pouvez utiliser les principes Revendications et Stratégie pour l'autorisation via [Authorize]

options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

[Authorize(Policy = "ElevatedRights")]

La seconde est très pratique dans les applications plus grandes où l’autorisation peut devoir être mise en œuvre avec différentes restrictions, processus et traitements en fonction du cas. Pour cette raison, nous pouvons Étendre AuthorizeAttribute et implémenter différentes alternatives d'autorisation pour notre projet.

public class CustomAuthorizeAttribute: AuthorizeAttribute  
{  
    public override voidOnAuthorization(AuthorizationContextfilterContext)  
    {  }
}

La méthode "correct-complete" pour effectuer une autorisation dans ASP.NET MVC utilise l'attribut [Authorize].

1
Anastasios Selmanis