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]
属性を繰り返して意図を明確にすることをお勧めします。
ASP.NET Core