Condividi tramite


ASP0026: [Authorize] viene sovrascritto da [AllowAnonymous] "da un livello superiore"

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

Causa

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

Annotazioni

L'attributo [AllowAnonymous] non disabilita completamente l'autenticazione. Quando le credenziali vengono inviate a un endpoint con [AllowAnonymous], l'endpoint autentica ancora tali credenziali e stabilisce l'identità dell'utente. L'attributo significa solo che l'autenticazione [AllowAnonymous]. L'endpoint verrà eseguito come anonimo solo quando non vengono fornite credenziali. Questo comportamento può essere utile per gli endpoint che devono funzionare sia per gli utenti autenticati che per gli utenti anonimi.

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

Questo avviso indica che un [Authorize] attributo viene sottoposto a override da un [AllowAnonymous] attributo "più lontano". Quando [AllowAnonymous] ha la precedenza, l'endpoint non richiede l'autenticazione, ma accetta comunque le credenziali ed elabora le credenziali, se fornite. Ciò significa:

  • Se una richiesta include le credenziali di autenticazione, l'endpoint autentica l'utente e rende disponibile la propria identità.
  • Se una richiesta non include credenziali, l'endpoint consente l'accesso anonimo.

Questo comportamento potrebbe esporre involontariamente gli endpoint destinati a richiedere l'autenticazione.

Come correggere le violazioni

L'azione corretta da eseguire se viene visualizzato questo avviso dipende dall'intenzione alla base degli attributi. L'attributo più distante [AllowAnonymous] deve essere rimosso se 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 be useful for endpoints that
    // allow but don't require authenticated users. When credentials are sent,
    // they will be authenticated; when no credentials are sent, the endpoint
    // allows anonymous access.
    [Authorize(AuthenticationSchemes = "Cookies")]
    [AllowAnonymous]
    public IActionResult Privacy() => null;
}

Quando eliminare gli avvisi

Il livello di gravità di questa diagnostica è Informazione. È 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] .