ASP.NET MVC2 Access-Control: Как сделать авторизацию динамически? - PullRequest
1 голос
/ 02 июня 2010

В настоящее время мы переписываем приложение ASP.NET MVC для наших организаций, которое уже было написано дважды. (Один раз MVC1, один раз MVC2). (Слава богу, что тогда производство еще не было готовым и слишком зрелым).

На этот раз, во всяком случае, это будет реальная сделка , потому что со временем мы будем реализовывать все больше и больше функций, и тестовые прогоны с MVC1 и MVC2 показали, что мы готовы к повышению.

До сих пор мы использовали авторизацию Controller и Action с AuthorizeAttribute.

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

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

Если вам разрешен доступ к этим гражданам через запись в специализированной таблице MajorHasRightsForCity, содержащей MajorId и CityId.

То, о чем я думал, примерно так:

Public ViewResult Edit(int cityId) {
    if(Access.UserCanEditCity(currentUser, cityId) {
        var currentCity = Db.Cities.Single(c => c.id == cityId);
        Return View(currentCity);
    } else {
        TempData["ErrorMessage"] = "Yo are not awesome enough to edit that shizzle!"
        Return View();
    }

Статический класс Access будет выполнять все виды проверок и возвращает из своих методов либо true, либо false.

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

Делает что-то подобное даже allowed?

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

Задумывались ли вы над написанием своего собственного атрибута фильтра действий?

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

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

2 голосов
/ 02 июня 2010

Это почти то же самое, что я бы сделал для приложения достойного размера.

Я бы вернул общий вид ошибки return View("Error");, если у пользователя нет доступа, поэтому вам не нужно обрабатывать сообщение об ошибке на каждом View.

Концептуально, в этом (Controller) должна лежать логика, определяющая, что View вернуть. Он останавливает кровотечение бизнес-логики в View.

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

 <% if (User.IsInRole("Admin")) { %>
      Html.RenderPartial("AdminPanel");
 <% } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...