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