ASP.net MVC глобальный фильтр авторизации, заставляющий логин выполнять действие AllowAnonymous
Настройка (с использованием MVC 4)
public class MyAuthorizeAttribute : AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase httpContext) {
var isAuthorised = base.AuthorizeCore(httpContext);
if(isAuthorised) {
// retrieve authentication ticket from cookie and
// create custome principal and attach to
// httpContext.User
}
return isAuthorised;
}
}
Gloabl.asax.cs:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new MyAuthorizeAttribute());
}
HomeController.cs:
using System.Web.Mvc;
public class HomeController : Controller
{
[AllowAnonymous]
public ActionResult Index()
{
return View();
}
}
Проблема
Вызов главной страницы заставляет загружать страницу входа в систему.
Вопрос
Когда действие HomeController.Index() украшено [AllowAnonymous], почему ASP перенаправляет меня на просмотр входа?
Я использую эту статью для справки
Ответы
Ответ 1
В соответствии с моим комментарием к исходному вопросу. Проблема была в представлении индекса, вызывала действия на других контроллерах, которые возвращали частичные представления. Просто рассмотрим все и отбросив старый атрибут [Authorize].
Ответ 2
Хотя исходный плакат нашел причину в его случае, я хотел бы поделиться своей резолюцией, поскольку я столкнулся с этим вопросом, столкнувшись с теми же симптомами.
В моем файле web.config я имел, подчиняясь логике веб-форм:
<authorization>
<deny users="?" />
</authorization>
У вас не должно быть этого, так как это предотвратит выполнение пользователем какого-либо действия без первого входа в систему, за исключением действия входа, к которому происходит перенаправление. Я только обнаружил это, когда попытался добавить второе публичное действие.
Ответ 3
У меня была аналогичная проблема, и в конце я использовал неправильный класс AllowAnonymousAttribute
. Существует два класса AllowAnonymousAttribute:
В вашем случае вы должны использовать, конечно, один из System.Web.Mvc
:)
Я потратил больше часа на то, чтобы понять это в моей программе
Ответ 4
Хотя это не ответ, но..
Попробуйте со встроенным кодом Authorize
и убедитесь, что AllowAnonymous
работает нормально. Я вижу в ваших пользовательских комментариях авторизации, которые вы пытаетесь
получить аутентификационный билет из файла cookie и создать custome main и присоединяться к httpContext.User
Я предлагаю вам сделать этот процесс очень раньше в Application_AuthenticateRequest
of Global.asax.cs
, как указано в этом .