Атрибут ASP.NET MVC AllowAnonymous не работает

Атрибут AllowAnonymous вообще не работает в моем проекте MVC (целевая структура 4.7).

Я пробовал все в Интернете, но все равно меня всегда перенаправляют на страницу входа. Даже я пробовал: mvc-override-allowanonymous-атрибут

Чего на самом деле мне не хватает?

Это мой контроллер:

using OnDemand.Helper;
using System.Web.Mvc;

namespace OnDemand.Controllers
{
    [App_Auth.AllowAnonymous]
    [System.Web.Mvc.AllowAnonymous]
    public class AdminDashboardController : Controller
    {
        private readonly DashboardHelper _dashboardHelper;
        public AdminDashboardController()
        {
            _dashboardHelper = new DashboardHelper();
        }
        [App_Auth.AllowAnonymous] // Not Working
        [System.Web.Mvc.AllowAnonymous] // Not Working
        public ActionResult Index()
        {
            return View(_dashboardHelper.DashboardData());
        }
    }
}

Конфигурация фильтра:

using System.Web.Mvc;
using OnDemand.App_Auth;

namespace OnDemand.App_Start
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new SessionExpireAttribute()); //check session expire and redirect to login
        }
    }
}

Глобальный asax-класс:

using OnDemand.App_Start;
using System;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace OnDemand
{
    public class MvcApplication : HttpApplication
    {
        protected void Application_BeginRequest()
        {
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
            Response.Cache.SetNoStore();
        }
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

        protected void Session_Start()
        {
            Session.Timeout = 24 * 60; // return 24 hours
        }
    }
}

Пользовательские классы атрибутов Authorize и AllowAnonymous:

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace OnDemand.App_Auth
{
    public class AuthorizeAccessAttribute : AuthorizeAttribute
    {

        private readonly int code;
        public AuthorizeAccessAttribute(int code)
        {
            this.code = code;
        }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var hasAccess = false;

            if (httpContext.Session["Roles"] == null) return false;

            if (SectionsAndFeatures.HasAccess(code, httpContext.Session["Roles"] != null ? httpContext.Session["Roles"].ToString() : string.Empty))
            {
                hasAccess = true;
            }
            return hasAccess;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.Result = new RedirectToRouteResult(
                                   new RouteValueDictionary
                                   {
                                       { "action", "UnauthorizedAccess" },
                                       { "controller", "Home" },
                                       { "area", "" }
                                   });  //new HttpUnauthorizedResult("You are not authorized.");
        }
    }

    public class AllowAnonymousAttribute : AuthorizeAttribute
    {
        public AllowAnonymousAttribute()
        {

        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            bool IsAuthenticAttribute =
                (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) ||
                filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)) &&
                filterContext.HttpContext.User.Identity.IsAuthenticated;

            if (!IsAuthenticAttribute)
            {
                base.OnAuthorization(filterContext);
            }
        }
    }
}

Веб-конфигурация:

<location path = "AdminDashboard/Index">
        <system.web>
            <authorization>
                <allow users = "*"/>
            </authorization>
        </system.web>
</location>
App_Auth.AllowAnonymous я никогда не видел этот атрибут, это нестандартно? что произойдет, если вы избавитесь от него?
Bagus Tesa 15.03.2022 09:28

@BagusTesa да, это нестандартно, код также упоминается в вопросе.

Tiny Developer 15.03.2022 09:33

@TinyDeveloper в этом случае ASP.NET не будет знать, что с этим делать. Аутентификация ASP.NET не нарушена. Он не нуждается в исправлении и пользовательских классах. Если бы это было так, сотни тысяч разработчиков заметили бы это еще 10-12 лет назад. Почему вы решили, что вам нужен этот атрибут? В чем была изначальная проблема?

Panagiotis Kanavos 15.03.2022 09:35

Сначала я начал с простого и легкого способа, но он не сработал.

Tiny Developer 15.03.2022 09:36

Создайте новый проект MVC, используя шаги в Создайте безопасное веб-приложение ASP.NET MVC 5 с входом в систему, подтверждением электронной почты и сбросом пароля.. Проверьте, что отличается между шаблоном и вашим текущим кодом, или, что еще лучше, создайте свое приложение на основе шаблона.

Panagiotis Kanavos 15.03.2022 09:42

Я попробовал и простой способ, и вот результаты: связь

Tiny Developer 15.03.2022 09:46

Какую аутентификацию вы используете? Если вы используете проверку подлинности Windows на уровне IIS, не имеет значения, какие атрибуты вы используете. Аутентификация выполняется самим IIS, и вызовы перехватываются еще до того, как они достигают вашего веб-приложения.

Panagiotis Kanavos 15.03.2022 10:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему бы просто не использовать его стандартным способом? простой атрибут AllowAnonymous без дублирования или пользовательских атрибутов.

[AllowAnonymous]
public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult Login()
    {
    }

    public ActionResult Logout()
    {
    }
}

Или в вашем коде:

using OnDemand.Helper;
using System.Web.Mvc;

namespace OnDemand.Controllers
{
    [AllowAnonymous]
    public class AdminDashboardController : Controller
    {
        private readonly DashboardHelper _dashboardHelper;
        public AdminDashboardController()
        {
            _dashboardHelper = new DashboardHelper();
        }
        [AllowAnonymous]
        public ActionResult Index()
        {
            return View(_dashboardHelper.DashboardData());
        }
    }
}

Если простое работало нормально, мне не нужно было создавать какие-либо пользовательские

Tiny Developer 15.03.2022 09:34

Я не понимаю, зачем нужно создавать настраиваемый атрибут для особых случаев? Если вам просто нужно разрешить доступ, я думаю, лучше проверить, почему у вас не работает обычный атрибут.

The scion 15.03.2022 09:36

Потому что атрибут System.Web.MVC.AllowAnonymous вообще не работал.

Tiny Developer 15.03.2022 09:37

этот код я написал сначала, но он не работал.

Tiny Developer 15.03.2022 09:38

Я думаю, что лучший подход состоит в том, чтобы сделать его максимально простым, использование настраиваемых атрибутов только увеличивает сложность.

The scion 15.03.2022 09:39

Простой @TinyDeveloper отлично работает для каждого разработчика уже более 12 лет. Если ваше приложение не работает, в нем есть ошибка. Эта ошибка не будет исправлена ​​добавлением дополнительного кода, о котором среда выполнения ничего не знает. Вам нужно найти ошибку и удалять ее. Попробуйте создать новый проект с помощью мастера ASP.NET MVC с аутентификацией Individual Accounts, чтобы увидеть, как на самом деле работают атрибуты и web.config.

Panagiotis Kanavos 15.03.2022 09:40

Я попробовал и простой способ, и вот результаты: результат предположительно неавторизованный.

Tiny Developer 15.03.2022 09:48

Я изменил код на: using OnDemand.Helper; using System.Web.Mvc; namespace OnDemand.Controllers { [AllowAnonymous] public class AdminDashboardController : Controller { private readonly DashboardHelper _dashboardHelper; public AdminDashboardController() { _dashboardHelper = new DashboardHelper(); } [AllowAnonymous] public ActionResult Index() { return View(_dashboardHelper.DashboardData()); } } }, но все равно не работает. @PanagiotisKanavos

Tiny Developer 15.03.2022 09:54

То, что вы написали в комментарии, не имеет ничего общего с аутентификацией. Мы не можем догадаться, что делает код вашего приложения, чего не хватает. Даже не какой тип аутентификации вы используете. Мы знаем, что аутентификация ASP.NET работает — все, что нужно сделать, это создать новый проект. Создайте новый проект веб-приложения, чтобы увидеть, как все работает на самом деле, а затем проверьте, чем он отличается от вашего кода.

Panagiotis Kanavos 15.03.2022 10:07
Ответ принят как подходящий

Я обнаружил, что мы используем пользовательский метод, мне просто нужно было включить имя моего контроллера в этот список:

public static List<string> ByPassController()
        {
            try
            {
                return new List<string>
                {
                    "Access",
                    "InterpreterSelection",
                    "Language",
                    "Log",
                    "CallBack",
                    "Controller",
                    "IvrOnDemand",
                    "Main",
                    "CallDetail",
                    "ConferenceParticipant",
                    "DashBoardData",
                    "CallWaitingResponse",
                    "IVRRejoinParticipant",
                    "IVRAuto",
                    "OnDemand",
                    "Assignment",
                    "SilentListenCallback",
                    "AutoOnDemand",
                    "StelCallLogs",
                    "DialOut",
                    "AdminDashboard",
                    "Developer"
                };
            }
            catch (Exception ex)
            {
                LogWriter.ErrorLogWriter(nameof(CommonFunction), nameof(ByPassController), ex.Message);
                return new List<string>();
            }
        }

Другие вопросы по теме