Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
ASP0026:
| 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] .