Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
ASP0026:
| Hodnota | |
|---|---|
| ID pravidla | ASP0026 |
| Kategorie | Využití |
| Oprava chybová nebo bezchybná | Nezlomitelný |
Příčina
Zdá se intuitivní, že [Authorize] atribut, který je umístěn "blíže" k akci MVC než [AllowAnonymous] atribut, by přepsal [AllowAnonymous] atribut a vynutil autorizaci. To ale nemusí být nutně případ. Záleží na relativním pořadí atributů.
Poznámka:
Atribut [AllowAnonymous] nezakazuje ověřování úplně. Když se přihlašovací údaje posílají do koncového bodu [AllowAnonymous], koncový bod tyto přihlašovací údaje stále ověřuje a vytvoří identitu uživatele. Tento [AllowAnonymous] atribut znamená, že ověřování není povinné – koncový bod se spustí jako anonymní jenom v případě, že nejsou zadané žádné přihlašovací údaje. Toto chování může být užitečné pro koncové body, které musí fungovat pro ověřené i anonymní uživatele.
Následující kód ukazuje příklady, kde se bližší atribut [Authorize] přepíše vzdálenějším atributem [AllowAnonymous].
[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
{
}
Popis pravidla
Toto upozornění indikuje, že [Authorize] atribut je přepsán atributem [AllowAnonymous] "daleko daleko". Pokud [AllowAnonymous] má přednost, koncový bod nevyžaduje ověřování, ale přesto přijímá a zpracovává přihlašovací údaje, pokud jsou zadané. To znamená:
- Pokud požadavek obsahuje ověřovací přihlašovací údaje, koncový bod ověří uživatele a zpřístupní jeho identitu.
- Pokud požadavek neobsahuje přihlašovací údaje, koncový bod povolí anonymní přístup.
Toto chování může neúmyslně vystavit koncové body, které měly vyžadovat ověření.
Jak opravit porušení
Správná akce, která se má provést, pokud se zobrazí toto upozornění, závisí na záměru atributů. Pokud se koncový bod nechtěně vystavuje anonymním uživatelům, měl by být atribut odsud [AllowAnonymous] odebrán. Pokud byl atribut [AllowAnonymous] určen k přepsání bližšího atributu [Authorize], můžete atribut [AllowAnonymous] opakovat za atributem [Authorize] a objasnit tak záměr.
[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;
}
Kdy potlačit upozornění
Úroveň závažnosti tohoto diagnostického prvku je informativní. Můžete potlačit upozornění, pokud je vaším záměrem přepsat atribut [Authorize]. Doporučujeme však záměr učinit zřejmým tím, že opakujete atribut [AllowAnonymous] po atributu [Authorize].