ASP0026: [Authorize] åsidosättas av [AllowAnonymous] från "längre bort"

Värde
Regel-ID ASP0026
Kategori Användning
Korrigeringen är antingen brytande eller icke-brytande Oskiljbar

Orsak

Det verkar intuitivt att ett [Authorize] attribut som placeras "närmare" en MVC-åtgärd än ett [AllowAnonymous] attribut skulle åsidosätta [AllowAnonymous]-attributet och tvinga auktorisering. Detta är dock inte nödvändigtvis fallet. Vad som spelar roll är attributens relativa ordning.

Anmärkning

Attributet [AllowAnonymous] inaktiverar inte autentisering helt. När autentiseringsuppgifter skickas till en slutpunkt med [AllowAnonymous]autentiserar slutpunkten fortfarande dessa autentiseringsuppgifter och upprättar användarens identitet. Attributet [AllowAnonymous] innebär bara att autentisering inte krävs – slutpunkten körs endast som anonym när inga autentiseringsuppgifter anges. Det här beteendet kan vara användbart för slutpunkter som måste fungera för både autentiserade och anonyma användare.

Följande kod visar exempel där ett närmare [Authorize] attribut åsidosätts av ett [AllowAnonymous] attribut som ligger längre bort.

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

Regelbeskrivning

Den här varningen anger att ett [Authorize] attribut åsidosätts av ett [AllowAnonymous] attribut från "längre bort". När [AllowAnonymous] har företräde kräver slutpunkten inte autentisering men accepterar och bearbetar fortfarande autentiseringsuppgifter om de tillhandahålls. Detta innebär att:

  • Om en begäran innehåller autentiseringsuppgifter autentiserar slutpunkten användaren och gör deras identitet tillgänglig.
  • Om en begäran inte innehåller autentiseringsuppgifter tillåter slutpunkten anonym åtkomst.

Det här beteendet kan oavsiktligt exponera slutpunkter som var avsedda att kräva autentisering.

Så här åtgärdar du överträdelser

Rätt åtgärd om du ser den här varningen beror på avsikten bakom attributen. Längre bort [AllowAnonymous]-attributet bör tas bort om det oavsiktligt exponerar slutpunkten för anonyma användare. Om attributet [AllowAnonymous] var avsett att åsidosätta ett närmare [Authorize] attribut kan du upprepa attributet [AllowAnonymous] efter attributet [Authorize] för att förtydliga avsikten.

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

När du ska ignorera varningar

Allvarlighetsgraden för den här diagnostiken är Information. Du kan ignorera varningar om din avsikt är att åsidosätta attributet [Authorize]. Vi rekommenderar dock att du gör avsikten tydlig genom att upprepa attributet [AllowAnonymous] efter attributet [Authorize].