Condividi tramite


ASP0026: [Authorize] è sottoposto a override da [AllowAnonymous] "lontano"

Valore
ID regola ASP0026
Categoria Utilizzo
La correzione causa un'interruzione o meno Non causa un'interruzione

Causa

Sembra intuitivo che un [Authorize] attributo posizionato "più vicino" a un'azione MVC rispetto a un [AllowAnonymous] attributo eseguirà l'override dell'attributo e forza l'autorizzazione [AllowAnonymous] . Tuttavia, questo non è necessariamente il caso. Ciò che conta è l'ordine relativo degli attributi.

Il codice seguente mostra esempi in cui un attributo più vicino [Authorize] viene sottoposto a override da un [AllowAnonymous] attributo più lontano.

[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
{
}

Descrizione regola

Avviso che un [Authorize] attributo viene sottoposto a override da un [AllowAnonymous] attributo "più lontano".

Come correggere le violazioni

L'azione corretta da eseguire se viene visualizzato questo avviso dipende dall'intenzione alla base degli attributi. L'attributo più lontano [AllowAnonymous] deve essere rimosso se non espone involontariamente l'endpoint agli utenti anonimi. Se l'attributo è stato progettato per eseguire l'override [AllowAnonymous] di un attributo più vicino [Authorize] , è possibile ripetere l'attributo [AllowAnonymous] dopo l'attributo [Authorize] per chiarire la finalità.

[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;
}

Quando eliminare gli avvisi

Il livello di gravità di questa diagnostica è Informazioni. È possibile eliminare gli avvisi se si intende eseguire l'override dell'attributo [Authorize] . È tuttavia consigliabile rendere chiara la finalità ripetendo l'attributo [AllowAnonymous] dopo l'attributo [Authorize] .