Атрибут 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>
@BagusTesa да, это нестандартно, код также упоминается в вопросе.
@TinyDeveloper в этом случае ASP.NET не будет знать, что с этим делать. Аутентификация ASP.NET не нарушена. Он не нуждается в исправлении и пользовательских классах. Если бы это было так, сотни тысяч разработчиков заметили бы это еще 10-12 лет назад. Почему вы решили, что вам нужен этот атрибут? В чем была изначальная проблема?
Сначала я начал с простого и легкого способа, но он не сработал.
Создайте новый проект MVC, используя шаги в Создайте безопасное веб-приложение ASP.NET MVC 5 с входом в систему, подтверждением электронной почты и сбросом пароля.. Проверьте, что отличается между шаблоном и вашим текущим кодом, или, что еще лучше, создайте свое приложение на основе шаблона.
Я попробовал и простой способ, и вот результаты: связь
Какую аутентификацию вы используете? Если вы используете проверку подлинности Windows на уровне IIS, не имеет значения, какие атрибуты вы используете. Аутентификация выполняется самим IIS, и вызовы перехватываются еще до того, как они достигают вашего веб-приложения.





Почему бы просто не использовать его стандартным способом? простой атрибут 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());
}
}
}
Если простое работало нормально, мне не нужно было создавать какие-либо пользовательские
Я не понимаю, зачем нужно создавать настраиваемый атрибут для особых случаев? Если вам просто нужно разрешить доступ, я думаю, лучше проверить, почему у вас не работает обычный атрибут.
Потому что атрибут System.Web.MVC.AllowAnonymous вообще не работал.
этот код я написал сначала, но он не работал.
Я думаю, что лучший подход состоит в том, чтобы сделать его максимально простым, использование настраиваемых атрибутов только увеличивает сложность.
Простой @TinyDeveloper отлично работает для каждого разработчика уже более 12 лет. Если ваше приложение не работает, в нем есть ошибка. Эта ошибка не будет исправлена добавлением дополнительного кода, о котором среда выполнения ничего не знает. Вам нужно найти ошибку и удалять ее. Попробуйте создать новый проект с помощью мастера ASP.NET MVC с аутентификацией Individual Accounts, чтобы увидеть, как на самом деле работают атрибуты и web.config.
Я попробовал и простой способ, и вот результаты: результат предположительно неавторизованный.
Я изменил код на: 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
То, что вы написали в комментарии, не имеет ничего общего с аутентификацией. Мы не можем догадаться, что делает код вашего приложения, чего не хватает. Даже не какой тип аутентификации вы используете. Мы знаем, что аутентификация ASP.NET работает — все, что нужно сделать, это создать новый проект. Создайте новый проект веб-приложения, чтобы увидеть, как все работает на самом деле, а затем проверьте, чем он отличается от вашего кода.
Я обнаружил, что мы используем пользовательский метод, мне просто нужно было включить имя моего контроллера в этот список:
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>();
}
}
App_Auth.AllowAnonymousя никогда не видел этот атрибут, это нестандартно? что произойдет, если вы избавитесь от него?