Поделиться через


ASP0026: [Authorize] переопределяется [AllowAnonymous] от "дальше"

Значение
Идентификатор правила ASP0026
Категория Использование
Исправление является критическим или не критическим Не критическое

Причина

Кажется интуитивно понятным, что [Authorize] атрибут помещается "ближе" к действию MVC, чем [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] Если атрибут был предназначен для переопределения более близкого [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 still be useful
    // for endpoints that allow but don't require authenticated users.
    [Authorize(AuthenticationSchemes = "Cookies")]
    [AllowAnonymous]
    public IActionResult Privacy() => null;
}

Когда лучше отключить предупреждения

Уровень серьезности этой диагностики — Сведения. Вы можете отключить предупреждения, если вы намерены переопределить [Authorize] атрибут. Однако рекомендуется очистить намерение, повторив [AllowAnonymous] атрибут после атрибута [Authorize] .