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