ASP.Net MVC и членство - PullRequest
       13

ASP.Net MVC и членство

1 голос
/ 17 мая 2009

Буду очень признателен за отзывы о том, чего я пытаюсь достичь:

Проблема:

  1. Я хотел бы разрешить пользователю моего приложения выполнять одно действие на контроллере. Например, пользователь может выполнить действие «сохранить» в классе моего контроллера, если у него есть необходимые полномочия.
  2. В проекте, над которым я работаю, создание ролей и их авторизация выполняется командой по развертыванию клиентов, а не под моим контролем. Итак, я программирую на «контрольную точку», которую можно назначить роли / пользователю, в то время как моему приложению нужно только проверять эту контрольную точку.
  3. Как получить концепцию контрольной точки в ASP.Net MVC? В частности, как включить / отключить кнопки в представлении на основе разрешения пользователя на контроллере?

Мое решение:

  1. Ссылка: http://weblogs.asp.net/fredriknormen/archive/2008/03/12/asp-net-mvc-framework-2-interception-and-creating-a-role-action-filter.aspx - в качестве отправной точки
  2. Вместо создания фильтра ролей, как объяснено в ссылке выше, у меня был бы класс ControlPointFilter, который получал бы модель и выполнял проверку авторизации.
  3. Проблема в том, что у меня есть класс View, и в данный момент я передаю коллекцию контрольных точек, к которой у пользователя есть доступ в коллекции ViewData [].
  4. В классе View я проверяю, присутствует ли соответствующая контрольная точка в коллекции ViewData (что мне не нравится - хочу минимизировать код в классе View)
  5. Другая проблема - в то время как фактическое имя контрольной точки задается в атрибуте для класса контроллера, где / как я могу передать эти атрибуты в представление и в то же время сохранить представление в чистоте?

Надеюсь, это поможет и ценит ваше время / усилия, чтобы ответить на этот вопрос!

Sunny

Ответы [ 2 ]

1 голос
/ 17 мая 2009

Одним из возможных решений этого является преобразование контрольных точек в атрибуты вида в действиях вашего контроллера (возможно, это те же самые вещи, хотя, из вашего вопроса это не ясно). Идея состоит в том, что ваша контрольная точка будет преобразовываться в значимые направления просмотра, такие как «AllowEdit», «AllowSave», «AllowDetailedView» и т. Д. Они станут записями в ViewData.

Используйте базовый класс контроллера для расширения Controller и предоставления ему коллекции ControlPoint. Пусть ваш фильтр заполнит эту коллекцию в контроллере. Пусть метод OnActionExecuted базового контроллера использует эту коллекцию и, в случае ViewResult, заполняет ViewData соответствующими значениями для коллекции директив представления. Отдельные действия контроллера также могут использовать коллекцию ControlPoint, чтобы определить, нужно ли им предоставлять данные для отдельных представлений на основе того, будет ли представление отображать дополнительные данные.

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

0 голосов
/ 17 мая 2009

Хм, не могли бы вы просто создать систему шаблонов, чтобы назначать роли пользователям? То есть создать шаблон пользователя «Опытный пользователь» с ролями «CustomerService» и «ConfigurationEditor», а затем использовать систему ролей как обычно (например, Roles.IsUserInRole (username, rolename))?

Для действий вы затем используете

[Authorized(Roles="CustomerService,CustomerServiceAdmin")]
public ActionResult Edit(...)
{
}

Для просмотра вы используете

<% if (Roles.IsUserInRole(Context.User.Name, "CustomerService")) %>
...