2012-06-13 6 views
1

Я начинаю разработку приложения ASP NET MVC 3, и я старался следовать некоторым хорошим методам DDD. У меня есть следующая ситуация, которая бы хотела высказаться. Одной из системных функций является создание действий, в которых участвует один или несколько пользователей системы, например, собрание. Любой пользователь с определенным профилем доступа может создавать новые действия, возможно, только пользователь, создающий активность, может изменить ее. Вопрос: Какое правильное место для вставки этого правила?ASP.NET MVC Validation Security Issue

-> В каждом сетевом объекте «Activity»? Кажется, ломает СУХОЙ.

-> В хранилище в момент сохранения изменений? В этом случае, какой был бы правильный момент, чтобы передать разрешения пользователя? Еще один параметр этого метода? В конструкторе класса (В моей модели репозитории являются интерфейсами, если я принимаю этот параметр, зависимость будет явной только на уровне инфраструктуры, где реализованы хранилища?)

-> Контроллер? Кажется, он сотрудничает с анемичной моделью.

Кстати, вопросов предостаточно ... О чем вы думаете?

+0

В ваших службах подачи заявлений? –

ответ

1

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

[Authorize(Roles="Activity Admin")] 
public ActionResult CreateActivity() 
{ 
    return View(); 
} 

Где «Активность администратора» - ваша роль создателя. Тогда ваша правка может выглядеть примерно так:

[Authorize(Roles="Activity Admin")] 
public ActionResult EditActivity(int id) 
{ 
    Activity activity = ActivityRepository.GetActivityByID(id); 

    if (activity.CreatorID != CurrentUser.ID) 
    { 
     return RedirectToAction("Activities"); 
    } 

    return View(activity); 
} 

что если оператор делает проверку, чтобы убедиться, что вошедшего в пользователь был пользователь, который фактически создал свою деятельность. CurrentUser.UserID может быть заменен любым методом, который вы используете для получения уникального идентификатора текущего входа в систему. Обычно я использую класс ProfileBase для реализации класса, который позволяет мне отслеживать информацию текущего пользователя. Ссылка ниже на другой вопрос SO показывает, как вы можете это сделать.

How can i use Profilebase class?