2011-12-19 6 views
2

Мой MVC3 приложение предоставляет три способа для пользователя, чтобы войти вASP.Net MVC - Условный Несанкционированное Перенаправление

  1. Email + Псевдоним
  2. OpenID провайдер
  3. Имя пользователя + пароль

первые два для посетителей без учетных записей, что позволяет им комментировать/голосовать за вещи; последнее для авторов и администраторов, у которых есть учетные записи пользователей db с повышенными привилегиями. Таким образом, существует два регистрационных бланка: один для посетителей и один для полных пользователей.

Неавторизованные/неавторизованные попытки доступа к ресурсу в качестве стандарта перенаправляются на страницу входа в систему.

Вопрос:

  1. Как я мог бы условно перенаправить эти запросы на соответствующие? Ресурсы, требующие прав Author/Admin для полной формы входа в систему пользователя, а ресурсы, требующие только привилегий посетителя для регистрации посетителей в форме?

  2. Кроме того, могу ли я работать, избегая переадресаций в случае вызова AJAX или частичного просмотра? Например, я хотел бы включить частичное представление комментариев в свой вид ввода, и если они не прошли проверку подлинности, а не перенаправляют, а просто вставляют в них журнал посетителей.

Обновление: Я не хочу поддерживать 2 атрибута Atuhorize.

ответ

1

1- Вы можете наследовать от [AuthorizeAttribute] и настроить реализацию для маршрутизации на желаемую страницу Unauthorized.

Смотрите выбранный awnser этот вопрос (т. Е, $.Get(url) или $("#somediv").Load(url)) Redirecting unauthorized controller in ASP.NET MVC

2- Если ваш загружаются партиалы из вызова Ajax, убедитесь, что действия, вызываемые url надлежащим образом оформлены с ваш пользовательский [AuthorizeAttribute].

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

@if (User.Identity.IsAuthenticated) 
    { 
     // Normal case 
    } 
    else 
    { 
     @Html.Partial("Login") 
    } 

Если ваш логин в части входа будет показывать желаемый логин.

Update

Вы могли бы реализовать 2 различных атрибутов, по одному для каждого сценария.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class IsUserAdminAttribute : CustomAuthorizedBaseAttribute 
{ 
    // Custom logic to redirect to admin logon partial/view 
    ... 
} 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class IsAuthenticatedAttribute : CustomAuthorizedBaseAttribute 
{ 
    // Custom logic to redirect to basic/comment logon partial/view 
    ... 
} 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public abstract class CustomAuthorizedBaseAttribute : AuthorizeAttirbute 
{ 
    // Shared custom logic implementation 
    ... 
} 

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

+0

Спасибо за ответ. Это близко, но не то, что я ищу. У меня есть настраиваемый фильтр/атрибут авторизации, и я думал о методе 'OnAuthorization()', но я стараюсь, чтобы все вещи DRY были максимально возможными, поэтому я стараюсь избегать того, чтобы мой атрибут был в курсе Views.Что касается логики AJAX, даже если бы я был включен в Razor, как вы предположили, если мой атрибут вызывает перенаправление, это вызовет ту же проблему, нет? Наконец, мне кажется, что я должен был знать о требуемых ролях, чтобы знать, в какую регистрационную форму они должны быть отправлены. –

+0

«Что касается логики AJAX, даже если я заключил в Razor, как вы сказали, если мой атрибут вызывает перенаправление, это вызовет ту же проблему, нет?» Yup, это либо украшение '[AuthorizeAttribute]' (если вы на самом деле вызываете действие контроллера для рендеринга вашего частичного), либо некоторый '@if (User.Identity.IsAuthenticated) {...}' wrapping (если вы выполняете частичное без вызов любого действия контроллера). –

+0

«У меня есть настраиваемый фильтр/атрибут авторизации, и я думал о методе OnAuthorization(), но я стараюсь, чтобы все вещи DRY были максимально возможными, поэтому я стараюсь избегать того, чтобы мой атрибут был в курсе« Views ». Не можете ли вы использовать 2 разных класса, которые наследуются от '[AuthorizeAttribute]'? Или, что еще лучше, добавьте слой наследования между вашим 2 пользовательским '[AuthorizeAttribute]', чтобы сохранить общий материал. –

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