ASP0026: [Authorize][AllowAnonymous] によって "遠く" からオーバーライドされる

Value
ルール ID ASP0026
カテゴリ 使用法
修正が中断ありか中断なしか なし

原因

[Authorize] 属性を [AllowAnonymous] 属性よりも MVC アクションの "近く" に配置すると、[AllowAnonymous] 属性がオーバーライドされ、承認が適用されるのが直感的に見えます。 しかし、必ずしもそうではありません。 重要なのは、属性の相対的な順序です。

次のコードは、近い [Authorize] 属性が遠い [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
{
}

規則の説明

[Authorize] 属性が [AllowAnonymous] 属性によって "遠く" からオーバーライドされたことを警告します。

違反の修正方法

この警告が表示された場合に取る適切なアクションは、属性の背後にある意図によって異なります。 遠い [AllowAnonymous] 属性は、意図せずにエンドポイントを匿名ユーザーに公開している場合は削除する必要があります。 [AllowAnonymous] 属性が近い [Authorize] 属性をオーバーライドすることを意図していた場合、[Authorize] 属性の後に [AllowAnonymous] 属性を繰り返すことで意図を明確化できます。

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

どのようなときに警告を抑制するか

この診断の重大度レベルは Information です。 [Authorize] 属性をオーバーライドすることを意図している場合は、警告を抑制できます。 ただし、[Authorize] 属性の後に [AllowAnonymous] 属性を繰り返して意図を明確にすることをお勧めします。