ASP0026: [Authorize]
é substituído por [AllowAnonymous]
de "mais longe"
Valor | |
---|---|
ID da regra | ASP0026 |
Categoria | Uso |
Correção interruptiva ou sem interrupção | Sem interrupção |
Causa
Parece intuitivo que um atributo [Authorize]
colocado “mais próximo” de uma ação MVC do que um atributo [AllowAnonymous]
substituiria o atributo [AllowAnonymous]
e forçaria a autorização. No entanto, isso não é necessariamente o caso. O que importa é a ordem relativa dos atributos.
O código a seguir mostra exemplos em que um atributo [Authorize]
mais próximo é substituído por um atributo [AllowAnonymous]
que está mais distante.
[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
{
}
Descrição da regra
Aviso de que um atributo [Authorize]
é substituído por um atributo [AllowAnonymous]
de "mais longe".
Como corrigir violações
A ação correta a ser tomada se você vir esse aviso depende da intenção por trás dos atributos. O atributo [AllowAnonymous]
mais distante deverá ser removido se estiver expondo involuntariamente o ponto de extremidade a usuários anônimos. Se o atributo [AllowAnonymous]
tiver a intenção de substituir um atributo [Authorize]
mais próximo, você poderá repetir o atributo [AllowAnonymous]
após o atributo [Authorize]
para esclarecer a intenção.
[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 suprimir avisos
O nível de gravidade desse diagnóstico é Informação. Você poderá suprimir avisos se sua intenção for substituir o atributo [Authorize]
. No entanto, recomendamos que você deixe a intenção clara repetindo o atributo [AllowAnonymous]
após o atributo [Authorize]
.