Udostępnij za pośrednictwem


ASP0026: [Authorize] jest zastępowany przez [AllowAnonymous] "dalej"

Wartość
Identyfikator reguły ASP0026
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność

Przyczyna

Wydaje się intuicyjne, że [Authorize] atrybut umieszczony "bliżej" akcji MVC niż [AllowAnonymous] atrybut zastąpi [AllowAnonymous] atrybut i wymusza autoryzację. Jednak niekoniecznie tak jest. To, co ma znaczenie, to względna kolejność atrybutów.

Poniższy kod pokazuje przykłady, w których bliżej [Authorize] atrybut jest zastępowany przez [AllowAnonymous] atrybut, który jest dalej.

[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
{
}

Opis reguły

Ostrzeżenie, że [Authorize] atrybut jest zastępowany przez [AllowAnonymous] atrybut z "dalej".

Jak naprawić naruszenia

Prawidłowa akcja do wykonania, jeśli to ostrzeżenie zależy od intencji atrybutów. Atrybut odejścia [AllowAnonymous] powinien zostać usunięty, jeśli nieumyślnie uwidacznia punkt końcowy użytkownikom anonimowym. [AllowAnonymous] Jeśli atrybut miał zastąpić bliżej [Authorize] atrybutu, można powtórzyć [AllowAnonymous] atrybut po atrybucie[Authorize], aby wyjaśnić intencję.

[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;
}

Kiedy pomijać ostrzeżenia

Poziom ważności tej diagnostyki to Informacje. Możesz pominąć ostrzeżenia, jeśli twoim zamiarem jest zastąpienie atrybutu [Authorize] . Zalecamy jednak, aby intencja jest jasna, powtarzając [AllowAnonymous] atrybut po atrybucie [Authorize] .