Sdílet prostřednictvím


ASP0026: [Authorize] je přepsán z [AllowAnonymous] "daleko"

Hodnota
ID pravidla ASP0026
Kategorie Využití
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující

Příčina

Zdá se intuitivní, že [Authorize] atribut umístěný "blíž" k akci MVC než [AllowAnonymous] atribut by přepsal [AllowAnonymous] atribut a vynutit autorizaci. To ale nemusí být nutně případ. Záleží na relativním pořadí atributů.

Následující kód ukazuje příklady, kde se blíže [Authorize] atribut přepíše atributem [AllowAnonymous] , který je vzdálenější.

[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

Upozornění, že [Authorize] atribut je přepsán atributem [AllowAnonymous] od "daleko".

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. [AllowAnonymous] Pokud byl atribut určen k přepsání bližšího [Authorize] atributu, můžete atribut opakovat [AllowAnonymous] za [Authorize] atributem a objasnit 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 still be useful
    // for endpoints that allow but don't require authenticated users.
    [Authorize(AuthenticationSchemes = "Cookies")]
    [AllowAnonymous]
    public IActionResult Privacy() => null;
}

Kdy potlačit upozornění

Úroveň závažnosti této diagnostiky je Informace. Upozornění můžete potlačit, pokud je vaším záměrem [Authorize] přepsat atribut. Doporučujeme však záměr vymazat opakováním atributu [AllowAnonymous] za atributem [Authorize] .