Compartilhar via


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.

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