ASP0026 : [Authorize]
est substituée par [AllowAnonymous]
de « plus loin »
active | |
---|---|
Identificateur de la règle | ASP0026 |
Catégorie | Utilisation |
Le correctif est cassant ou non cassant | Sans rupture |
Cause
Il semble logique qu’un attribut [Authorize]
placé « plus près » d’une action MVC qu’un attribut [AllowAnonymous]
remplacerait l’attribut [AllowAnonymous]
et forcerait l’autorisation. Pourtant, ce n’est pas nécessairement le cas. En fait, c’est l’ordre relatif des attributs qui compte.
Le code suivant montre des exemples où un attribut [Authorize]
plus près est remplacé par un attribut [AllowAnonymous]
plus loin.
[AllowAnonymous]
public class MyController
{
[Authorize] // Overridden by the [AllowAnonymous] attribute on the class
public IActionResult Private() => null;
}
[AllowAnonymous]
public class MyControllerAnon : ControllerBase
{
}
[Authorize] // Overridden by the [AllowAnonymous] attribute on MyControllerAnon
public class MyControllerInherited : MyControllerAnon
{
}
public class MyControllerInherited2 : MyControllerAnon
{
[Authorize] // Overridden by the [AllowAnonymous] attribute on MyControllerAnon
public IActionResult Private() => null;
}
[AllowAnonymous]
[Authorize] // Overridden by the preceding [AllowAnonymous]
public class MyControllerMultiple : ControllerBase
{
}
Description de la règle
Avertissement indiquant qu’un attribut [Authorize]
est remplacé par un attribut [AllowAnonymous]
de « plus loin ».
Comment corriger les violations
L’action appropriée à entreprendre si vous voyez cet avertissement dépend de l’intention derrière les attributs. L’attribut [AllowAnonymous]
plus loin doit être supprimé s’il expose involontairement le point de terminaison à des utilisateurs anonymes. Si l’attribut [AllowAnonymous]
était destiné à remplacer un attribut [Authorize]
plus près, vous pouvez répéter l’attribut [AllowAnonymous]
après l’attribut [Authorize]
pour clarifier l’intention.
[AllowAnonymous]
public class MyController
{
// This produces no warning because the second, "closer" [AllowAnonymous]
// clarifies that [Authorize] is intentionally overridden.
// Specifying AuthenticationSchemes can still be useful
// for endpoints that allow but don't require authenticated users.
[Authorize(AuthenticationSchemes = "Cookies")]
[AllowAnonymous]
public IActionResult Privacy() => null;
}
Quand supprimer les avertissements
Le niveau de gravité de ce diagnostic est Information. Vous pouvez supprimer des avertissements si votre intention consiste à remplacer l’attribut [Authorize]
. Toutefois, nous vous recommandons d’effacer l’intention en répétant l’attribut [AllowAnonymous]
après l’attribut [Authorize]
.