Если текущий пользователь не выполняет роль, требуемую [Авторизовать], могу ли я автоматически перенаправить его?

На сайте ASP.NET MVC, который я создаю, у меня есть несколько методов, в которых пользователи, которые их используют, должны быть в определенной роли (если это не так, это означает, что они отстранены от сайта) . Для этого я без проблем использую атрибут [Authorize(Roles="RoleName")].

Однако я не совсем понимаю, что происходит с пользователями, которые не проходят эту [Authorize] проверку? Что они показаны?

Я хочу перенаправить заблокированных пользователей на другое действие, если они попытаются использовать эти методы. На данный момент я использовал пустой атрибут [Authorize] (без указания каких-либо ролей), а затем проверял в коде действия, является ли пользователь частью роли или нет.

Мой подход кажется мне запахом кода. Можно ли указать, что показывать пользователю (или куда его перенаправлять), если он не проходит [Authorize] проверку?


person Maxim Zaslavsky    schedule 20.06.2010    source источник


Ответы (2)


Как указано на странице AuthorizeAttribute в MSDN:

Если неавторизованный пользователь пытается получить доступ к методу, помеченному атрибутом Authorize, инфраструктура MVC возвращает код состояния 401 HTTP. Если сайт настроен на использование проверки подлинности с помощью форм ASP.NET, код состояния 401 заставляет браузер перенаправлять пользователя на страницу входа.

Если вы используете аутентификацию с помощью форм и хотите перенаправить на страницу входа, вам нечего делать. В противном случае создайте свой собственный IAuthorizationFilter для перенаправления.

Изменить: см. это сообщение в блоге, которые в основном переопределяют AuthorizeAttribute вручную с настраиваемым перенаправлением.

person Julien Lebosquain    schedule 20.06.2010
comment
Как он перенаправляет пользователя на страницу входа, если пользователь уже вошел в систему (но не имеет достаточных прав)? Кроме того, как я могу реализовать свой собственный IAuthorizationFilter? Спасибо! - person Maxim Zaslavsky; 20.06.2010

Если вы не хотите реализовывать свой собственный IAuthorizationFilter, я считаю, что вы сможете переопределить поведение атрибута Authorize по умолчанию. Просто унаследуйте и переопределите HandleUnauthorizedRequest метод. Конечно, вам все равно понадобится способ определить, не удалось ли пользователю из-за того, что он не вошел в систему, или из-за отсутствия необходимых разрешений. Возможно, будет проще написать собственный фильтр авторизации.

person Ryan    schedule 21.06.2010