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, как указано в этом .