ASP0026: [Authorize]
se invalida de [AllowAnonymous]
"más lejos"
Valor | |
---|---|
Identificador de la regla | ASP0026 |
Categoría | Uso |
La corrección es problemática o no problemática | Poco problemático |
Causa
Parece intuitivo que un atributo [Authorize]
colocado "más cerca" de una acción de MVC que un atributo [AllowAnonymous]
invalidaría el atributo [AllowAnonymous]
y forzaría la autorización. Sin embargo, esto no tiene por qué ser así. Lo que importa es el orden relativo de los atributos.
En el siguiente código se muestran ejemplos en los que un atributo [Authorize]
más cercano se invalida mediante un atributo [AllowAnonymous]
que está más lejos.
[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
{
}
Descripción de la regla
Advertencia de que un atributo [Authorize]
se invalida mediante un atributo [AllowAnonymous]
de "más lejos".
Cómo corregir infracciones
La acción correcta que se debe realizar si ve esta advertencia depende de la intención detrás de los atributos. El atributo [AllowAnonymous]
más alejado debe quitarse si expone involuntariamente el punto de conexión a usuarios anónimos. Si el atributo [AllowAnonymous]
estaba diseñado para invalidar un atributo [Authorize]
más cercano, puede repetir el atributo [AllowAnonymous]
después del atributo [Authorize]
para aclarar la intención.
[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;
}
Cuándo suprimir las advertencias
El nivel de gravedad de este diagnóstico es Información. Puede suprimir advertencias si su intención es invalidar el atributo [Authorize]
. Sin embargo, se recomienda que la intención sea clara repitiendo el atributo [AllowAnonymous]
después del atributo [Authorize]
.