Какова лучшая практика для обеспечения безопасности на уровне поля в MVC 3 - PullRequest
1 голос
/ 18 июля 2011

Я создаю приложение MVC 3, которое будет использоваться несколькими различными группами.С моей точки зрения, я использую все HTML-помощники для создания своих пользовательских интерфейсов.(например, Html.DropDownListFor (), Html.EditorFor () и т. д.)

Мне нужно реализовать различные меры безопасности в зависимости от роли этого пользователя.Давайте рассмотрим пример человека:

У меня есть вид, который выглядит следующим образом:

@Html.LabelFor(m=>m.FirstName): @Html.TextBoxFor(m=>m.FirstName) <br />
@Html.LabelFor(m=>m.LastName):  @Html.TextBoxFor(m=>m.LastName) <br />

@Html.LabelFor(m=>m.IsActive):  @Html.EditorFor(m=>m.IsActive)

Мне нужно выполнить следующие действия: 1. Запретить пользователям, которых нет в«Администратор» роль от редактирования любого поля.2. Запретить пользователям редактировать поля Имя / Фамилия, если «IsActive» имеет значение false.

Кажется, мне нужен способ внедрить поведение во встроенные вспомогательные функции.Либо так, либо напиши свою.В StackOverflow есть и другие вопросы, в которых говорится о модели базы данных для хранения Security на основе ролей, но ничего не помогает со средним уровнем.

Я пытаюсь добиться повторного использования тех же представлений.Мне действительно нужно несколько просмотров?

Ответы [ 2 ]

2 голосов
/ 28 июня 2012

Создание пользовательского ModelMetaDataProvider.Это позволит вам использовать механизм бизнес-правил или даже простую реализацию ACL для изменения метаданных для каждой модели и ее свойств до того, как они попадут в представление.Тогда встроенные помощники обычно подчиняются метаданным при рендеринге поля.Например, если вы сделаете поле ShowForEdit = false, потому что текущий пользователь не имеет доступа, тогда помощник не будет отображать поле.

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

0 голосов
/ 18 июля 2011

Это довольно просто.

@Html.LabelFor(m=>m.FirstName): @if(User.IsInRole("Administrator")) {Html.TextBoxFor(m=>m.FirstName)} else {Html.DisplayFor(m=>m.FirstName)} <br />
@Html.LabelFor(m=>m.LastName):  @if(User.IsInRole("Administrator")) {@Html.TextBoxFor(m=>m.LastName)} else {Html.DisplayFor(m=>m.LastName)} <br />

@if(User.IsInRole("Administrator")) {
    Html.LabelFor(m=>m.IsActive)<text>:</text>  Html.EditorFor(m=>m.IsActive)
}

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

Лучше использовать отдельные ViewModels для администратора / не-администратора, если это так. Вы, вероятно, также добьетесь большего успеха, если будете использовать EditorTemplates.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...