У кого-нибудь есть хорошее объяснение того, как атрибут [Authorize] обрабатывает маршруты в стандарте ASP.NET приложение MVC 5?


Как вы можете видеть из моего предыдущего поста, у меня были большие трудности с атрибутом MVC 5 [Authorize]. Команда разработчиков в соседнем магазине не может понять, почему атрибут продолжает отказывать в каждом новом проекте, который я создаю в рамках 4.5.2, 4.5.3 или 4.6 (под fail я подразумеваю, что украшение метода действия атрибутом автоматически перенаправит всех пользователей, авторизованных или нет, на страницу 401). Моя новая стандартная практика заключается в создании пользовательского атрибута, наследуемого от AuthorizeAttribute в каждую систему членства я строю, но это, очевидно, не идеально.

MSDN не имеет никакого основанного на коде объяснения того, как атрибут фактически перенаправляет неавторизованных пользователей на страницу входа (ожидаемое поведение), что является критическим пониманием, которое необходимо, чтобы определить, лежит ли истинная ошибка в моей кодовой базе или вместо этого является причудой в настройках узла IIS. Кто-нибудь там может раз и навсегда убрать этот атрибут в белый ящик?

2 3

2 ответа:

Помните, что аутентификация и авторизация являются отдельными проблемами в вашем приложении.

В основном вам нужно будет реализовать IAuthenticationFilter

Взгляните на конвейер MVC5 http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html - после конвейера MVC4 произошел ряд изменений . http://www.dotnet-tricks.com/Content/images/mvc/ASP.NETMVC5Pipeline.png

Самое главное-это введение фильтра аутентификации. Ранее они объединили аутентификацию и обработку авторизации в фильтр [Authorize], теперь они разделили эти проблемы должным образом.

Есть хорошая статья Джеймса Чамберса, которая должна дать вам хороший обзор того, как эти фильтры ведут себя в жизненном цикле запроса: http://jameschambers.com/2013/11/working-with-iauthenticationfilter-in-the-mvc-5-framework/

Выбрасывание несанкционированного результата следует сделать это:

public void OnAuthentication(AuthenticationContext filterContext)
{
    if (!filterContext.Principal.Identity.IsAuthenticated)
        filterContext.Result = new HttpUnauthorizedResult();
}

В приложении MVC механизм аутентификации по умолчанию-это формы, для которых в наш проект добавлен контроллер учетных записей по умолчанию и соответствующие представления. Таким образом, просто позволив пользователю "провалиться", они окажутся на странице входа в систему.

Надеюсь, что это поможет :)

Во-первых, ASP.NET версия действительно не имеет никакого отношения ни к чему. Единственное, с чем вы можете столкнуться при переключении версий фреймворка, - это то, что некоторые методы могут быть устаревшими или добавленными. Тем не менее, существует очень мало вариаций между любым из 4.5 dot-релизов и для ваших целей здесь, очень мало изменений собирается 4.6.

Для атрибута Authorize, в частности, единственное, что имеет значение, - это ваша версия MVC, поскольку она является частью MVC. Поскольку это остается неизменным, вы на самом деле ничего не делая, пытаясь переключить версии фреймворка.

Что касается того, как он проходит, то это довольно прямолинейно. Атрибут Authorize фактически никуда не направляется; все, что он делает, это возвращает код состояния 401 или 403, если пользователь не авторизован. Платформа MVC берет на себя в этот момент и предпринимает соответствующие шаги для авторизации пользователя на основе используемой схемы аутентификации. Для форм авторизации / идентификации, он будет перенаправлять на страницу логина, для HTTP дайджест-он появится браузерный модальный логин и т. д.

Длинный и короткий, если вы перенаправлены, это означает, что Authorize возвращает 401, а если он возвращает 401, это означает, что пользователь не авторизован. Просто и ясно. Это может быть то, что у пользователя нет ролей, которые вы думаете, что у него есть, пользователь фактически не вошел в систему (распространенная проблема с Windows Auth на машине, которая неправильно подключена к домену или иным образом потеряла связь с AD)и т. д.