2013-05-23 2 views
4

У меня есть проект MVC4 с настройкой simplemembership. Это все работает и т. Д., Но я хотел бы знать, как сообщить ему, что контроллер/действие перенаправляется, когда пользователю не разрешено просматривать данную страницу.Как настроить, что происходит при использовании атрибута Authorize (Roles)?

Например, если я использую [Authorize(Roles="Admin")] и попытаться просмотреть эту страницу с вошедшего в систему пользователя, который не имеет роль «Администратор» он перенаправляет меня на страницу входа в систему, даже если я уже вошел в систему.

Я хотел бы изменить это на что-то еще ... может быть, 404 или хорошее сообщение, чтобы сказать: «У вас нет права просматривать этот контент».

Я пробовал поиск в Интернете для всего, что я могу придумать, чтобы сделать это, но пока не нашел ответа.

Можно ли это сделать с текущей настройкой или мне нужно что-то еще? Указатель в правильном направлении был бы оценен :)

ответ

2

Попробуйте создать пользовательский AuthrorizeAttribute и переопределить метод OnAuthorization так, что вы делаете редирект на пользовательской странице, если разрешение не удается, и на странице входа в систему в случае неудачной аутентификации. Другой подход, который используют некоторые люди, заключается в проверке подлинности текущего пользователя на странице входа в систему, и если это так, вы можете предположить, что они были перенаправлены на эту страницу, поскольку авторизация завершилась неудачно. В этом случае отобразите специальное сообщение пользователю, указывающее, что у них нет права доступа к этой странице. Для некоторых приложений это может иметь смысл, поскольку у пользователя может быть несколько учетных записей, и они хотят войти в другой аккаунт, где они уполномочены выполнять эту операцию. Некоторые из этих концепций - discussed in this QA.

+0

Сообщение на странице не является идеальным, хотя я думаю, это работает.В приложениях «одна учетная запись для каждого пользователя», я думаю, вы могли бы даже скрыть форму входа и показать «неавторизованное» сообщение, если они уже вошли в систему. – Hades

2

Это, к сожалению, проблема с Asp.net в целом (хотя она исходит из проблемы в спецификации HTTP), она не проводит различия между неавторизованными пользователями и не прошедших проверку подлинности пользователей, хотя они, похоже, не хотят говорить об этой разнице. Чтобы изменить это поведение, вам нужно будет написать много кода, и проще написать собственный обработчик, чтобы проверить, не прошли ли вы уже проверку подлинности.

Стандарт HTTP никогда не предназначен для того, чтобы пользователь находился в «аутентифицированном состоянии». На самом деле, он даже не знает о понятии «пользователь». Каждый запрос страницы предназначен для переноса информации, независимой от других запросов страницы. Тот факт, что браузеры кэшируют эту информацию (или аутентификация выполняется cookie), не имеет никакого отношения к тому, что подразумевается в стандарте.

Стандарт в основном говорит о том, что сервер должен выдавать 401, если запрашиваемый ресурс не авторизован, и поскольку у каждого запроса есть его собственная авторизация, намечается простой сценарий прохода/сбоя. На сайте нет понятия авторизованного состояния. Запрос либо преуспевает, либо терпит неудачу.

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

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

403 Forbidden vs 401 Unauthorized HTTP responses

+0

Я согласен со всем, что вы там говорили, но, к сожалению, на самом деле он не отвечает на вопрос;). Мне просто нужно знать, есть ли способ сообщить SimpleMembership/SimpleRoleProvider перенаправить на что-то другое, кроме действия входа, когда пользователь вошел в систему, но не в авторизованной роли? – Hades

Смежные вопросы