Что касается Authoirization (против ваших 3 ролей), это легче всего обрабатывать на уровне метода действия.Вы украшаете метод действия с помощью [Authorize (Roles = "Admin")].
Относительно вашего контроллера и вида дизайна, это может зависеть от того, как вы хотите, чтобы ваша структура URL выглядела, и хотите ли вы следоватьСоглашения MVC3.
По соглашению ваша схема URL будет выглядеть следующим образом:
www.site.com/controllerName -- defaults to index action method
www.site.com/controllerName/action -- specific action method
www.site.com/controllerName/action/id -- send optional argument to action method
www.site.com/controllerName/id -- send optional argument to index action method
Поэтому, если вы хотите, чтобы ваши URL были / Admins / dosomething, / Tutor / dosomething и / Clients / dosomething,и вы хотите придерживаться соглашений MVC, назовите свои контроллеры в соответствии с именами ваших ролей.
Если вы хотите, чтобы администратор выполнял функцию репетитора, добавьте это к методу действия:
public class TutorsController
{
[Authorize(Roles = "Tutor,Admin")]
public ActionResult DoSomething(string id)
{
var isAdmin = User.IsInRole("Admin");
// ...do stuff
}
}
С учетом сказанного, ничто не мешает вам нарушать соглашения и разрабатывать ваш URLсхема отдельно от вашего контроллера и схема действия метода.Это будет просто больше работы, потому что вам придется создавать собственные маршруты.
Ответ на комментарии 1 & 2
Ваш второй комментарий ближе, и Бассам Маханни ответил на этот вопрос правильно .Функциональность для перечисления репетиторов должна идти на контроллере репетиторов.Если вы планируете использовать шаблоны DI / IoC / Repository, вы поймете, почему.Подумайте об этом с точки зрения того, над каким набором сущностей работает пользователь.Обычно лучше поместить весь доступ к сущности Tutors, установленной в TutorsController.Затем вы можете ограничить возможность просмотра Tutor'а этим списком примерно так:
public class TutorsController
{
[Authorize(Roles="Admin")]
public ActionResult ListAll()
{
// only admins can list all, tutors / clients cannot access this page
}
}
Если это то, что вам нужно, должен быть соответствующий модульный тест, который гарантирует, что этот метод действия имеет фильтр авторизации,и что его свойство Roles равно «Admin».
Причина, по которой я рекомендую этот подход, заключается в том, что он облегчит работу, если позже вы решите использовать внедрение зависимости конструктора для репозитория.Если бы вы поместили некоторые элементы доступа к данным Tutors в AdminController, а другие элементы доступа к данным Tutors в TutorsController, вам пришлось бы внедрить ваш TutorsRepository в конструктор обоих контроллеров.