Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
ASP0026:
| 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.
Observação
O [AllowAnonymous] atributo não desabilita a autenticação totalmente. Quando as credenciais são enviadas para um ponto de extremidade com [AllowAnonymous], o ponto de extremidade ainda autentica essas credenciais e estabelece a identidade do usuário. O [AllowAnonymous] atributo significa apenas que a autenticação não é necessária—o endpoint será executado como anônimo somente se nenhuma credencial for fornecida. Esse comportamento pode ser útil para endereços que precisam funcionar para usuários autenticados e anônimos.
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
Esse aviso indica que um [Authorize] atributo é substituído por um [AllowAnonymous] atributo de "mais distante". Quando [AllowAnonymous] tem precedência, o ponto de extremidade não requer autenticação, mas ainda aceita e processa credenciais se elas forem fornecidas. Isso significa:
- Se uma solicitação incluir credenciais de autenticação, o ponto de extremidade autenticará o usuário e disponibilizará sua identidade.
- Se uma solicitação não incluir credenciais, o endpoint permitirá acesso anônimo.
Esse comportamento pode expor involuntariamente pontos de extremidade destinados a exigir autenticação.
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 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 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].