Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ASP0026:
| Значение | |
|---|---|
| Идентификатор правила | ASP0026 |
| Категория | Использование |
| Исправление является нарушающим или ненарушающим | Неразрывный |
Причина
Кажется интуитивно понятным, что атрибут [Authorize], помещенный "ближе" к действию MVC, чем атрибут [AllowAnonymous], будет переопределять атрибут [AllowAnonymous] и принуждать авторизоваться. Однако это не обязательно так. Важно именно относительное расположение атрибутов.
Замечание
Атрибут [AllowAnonymous] не полностью отключает проверку подлинности. Когда учетные данные отправляются в конечную точку [AllowAnonymous], конечная точка по-прежнему проверяет подлинность этих учетных данных и устанавливает удостоверение пользователя. Атрибут [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] непреднамеренно делает конечную точку доступной анонимным пользователям, его следует удалить. Если атрибут [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;
}
Когда лучше отключить предупреждения
Уровень важности этой диагностики — Информация. Вы можете отключить предупреждения, если вы намерены переопределить [Authorize] атрибут. Однако мы рекомендуем уточнить намерение, повторив атрибут [AllowAnonymous] после атрибута [Authorize].
ASP.NET Core