2012-04-25 12 views
3

Наше приложение переносится из WebForms в MVC. У нас есть другой способ обработки разрешений. Запрос базы данных запрашивается для подтверждения авторизации пользователя. Это представление возвращает, согласно каждому пользователю, всю иерархию меню. Например, если пользователь1 пытается получить доступ к странице с именем SecretList.aspx, поиск применяется через иерархию меню (сохраняется в сеансе HTTP после авторизации), чтобы проверить авторизацию доступа. Если для этого пользователя существует элемент меню, связанный с SecretList.aspx, доступ предоставляется.Доступ к контроллеру MVC

Мой вопрос в том, как реализовать этот подход в ASP.NET MVC 3?

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

Чтобы использовать ограничения маршрута, могу ли я получить доступ к сеансу HTTP и получить мою иерархию меню для запроса авторизации?

В пользовательский контроллер, какой метод следует учитывать при перегрузке? Могу ли я проверить авторизацию и перенаправить на другой вид, прежде чем контроллер выполнит полный код действия?

Любая другая лучшая идея?

+0

Вы можете использовать стандартный поставщик ролей или настроить его? http://stackoverflow.com/questions/376655/asp-net-mvc-problem-setting-the-authorize-attribute-role-from-a-variable-requi – kenny

+0

У меня нет доступа к данным о ролях в моем коде , Все роли и отношения пользователей находятся внутри представления базы данных. –

+0

Так они находятся в поставщике членства SQL. – kenny

ответ

2

Я бы использовал настраиваемый фильтр действий, который добавляется глобально ко всем действиям, он будет работать так же, как и встроенный атрибут авторизации. Фильтр действий запускается после того, как маршруты разрешены и контроллер создан (так что все, что передается контроллеру, должно быть конструировано любым пользователем), он может затем проверить, может ли пользователь выполнить действие, или же вместо этого должен быть возвращен другой ActionResult.

Я бы очень хотел посмотреть источник MVC (или с помощью такого инструмента, как ILSpy), чтобы просмотреть код для атрибута авторизации.

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

+0

нет необходимости ILSpy: http: //aspnet.codeplex.com/ – WDRust

+0

Да, я знаю, что теперь это с открытым исходным кодом, однако вы получаете лучший опыт просмотра, используя ILSpy, чем вы делаете в Интернете (перейдите к определению, анализу и т. д.). – Betty

1

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

public class MenuAccessAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting (ActionExecutingContext filterContext) 
     { 
      var requestRoute = filterContext.RouteData.Route; 

      var currentUser = WebWorker.CurrentUser; // Or wathever is your thing to get the current user from session 

      if (currentUser != null && !MenuAccessService.UserHasAccessToRoute(currentUser, requestRoute)) 
      { 
       filterContext.Result = new RedirectToRouteResult("MenuAccessDenied"); 
      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 

Или что-то в этом направлении.

затем, в global.asax Application_Start

 GlobalFilters.Filters.Add(new MenuAccessAttribute()); 

Но, если бы я тебя, я бы потратить некоторое время на адаптацию мою логику доступа с ASP.NET MVC ролей, реализации пользовательских RoleProvider и декорирования мои контроллеры и действия с соответствующими атрибутами авторизации.

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