ASP0026:
| 값 | |
|---|---|
| 규칙 ID | ASP0026 |
| 범주 | 사용 |
| 수정이 치명적인 문제를 일으키는지 여부 또는 문제없는지 여부 | 비파괴 |
원인
MVC 작업에 "더 가깝게" 배치된 [Authorize] 특성이 [AllowAnonymous] 특성을 재정의하고 권한을 부여하도록 강제하는 것은 직관적으로 보일 수 있습니다. 그러나 반드시 그렇지는 않습니다. 중요한 것은 특성의 상대적 순서입니다.
비고
이 특성은 [AllowAnonymous] 인증을 완전히 사용하지 않도록 설정하지 않습니다. 자격 증명을 사용하여 엔드포인트로 [AllowAnonymous]전송되는 경우 엔드포인트는 여전히 해당 자격 증명을 인증하고 사용자의 ID를 설정합니다. 이 특성은 [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]가 우선 순위를 차지할 때, 엔드포인트는 인증이 필요하지 않지만 자격 증명이 제공될 경우 이를 처리하고 수락합니다. 즉, 다음을 의미합니다.
- 요청에 인증 자격 증명이 포함된 경우 엔드포인트는 사용자를 인증하고 해당 ID를 사용할 수 있게 합니다.
- 요청에 자격 증명이 포함되지 않으면 엔드포인트에서 익명 액세스를 허용합니다.
이 동작은 의도치 않게 인증이 필요한 엔드포인트를 노출할 수 있습니다.
위반 문제를 해결하는 방법
이 경고가 표시되면 수행할 올바른 작업은 특성 뒤에 있는 의도에 따라 달라집니다. 의도치 않게 엔드포인트를 익명 사용자에게 노출하는 경우 멀리 떨어진 [AllowAnonymous] 특성을 제거해야 합니다.
[AllowAnonymous] 속성이 더 가까운 [Authorize] 속성을 재정의하도록 의도된 경우, [AllowAnonymous] 속성 뒤에 [Authorize] 속성을 반복하여 의도를 명확히 할 수 있습니다.
[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;
}
경고를 표시하지 않는 경우
이 진단의 심각도 수준은 참고사항입니다. 특성을 재정의하려는 경우 경고를 무시할 수 있습니다. 그러나 의도를 명확히 하기 위해 [AllowAnonymous] 특성 뒤에 [Authorize] 특성을 반복하는 것이 좋습니다.
ASP.NET Core