Compartir vía


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].