У меня проблема архитектуры, и я надеюсь, что кто-то может помочь мне в более идеальной стратегии. То, как я был вынужден сделать это, пахнет «запахом кода».Архитектура пользовательских ролей в ASP.NET MVC 5, проблемы с впрыском зависимостей
У меня есть два разных типа «Роли». У меня есть встроенные Роли идентичности, и у меня есть собственный набор ролей (Роли Группы пользователей). Я храню эти Роли Группы пользователей в базе данных, по существу, отношения между идентификатором пользователя, идентификатором роли группы пользователей и идентификатором группы пользователей. Я использую Ninject для инъекции зависимостей моего UserGroupService, который обрабатывает все операции CRUD для назначения пользователей определенным ролям в группах пользователей.
Мой первый план атаки заключался в создании специального атрибута авторизации, который я мог бы разместить на действиях, аналогичных атрибуту Identity [Authorize (Role = "")]. Мне не повезло с этим, потому что я не могу внедрить сервис в класс атрибута (нужен конструктор без параметров).
После этого не было выполнено, мой второй план атаки заключался в том, чтобы написать метод расширения для IPrincipal, существенно подражая User.IsInRole ("") с User.IsInUserGroupRole (""). Это не сработало, потому что я не могу ввести службу в статический класс.
В настоящее время я застреваю, в том числе некоторые булевы в модели каждого представления, в котором задействована ролевая логика. Так, например:
public ActionResult Navigation()
{
var isSystemAdmin = User.IsInRole("Administrator");
var isUserGroupAdmin = _userGroupService.IsUserGroupAdmin(User.Identity.GetUserId()) && !isSystemAdmin;
var isGeneralUser = !isSystemAdmin && !isUserGroupAdmin;
var model = new NavigationViewModel
{
IsSystemAdmin = isSystemAdmin,
IsUserGroupAdmin = isUserGroupAdmin,
IsGeneralUser = isGeneralUser
};
return PartialView("_Navigation", model);
}
Проблема здесь в том, что я должен сделать это в любое время, я хочу, чтобы определить, какую роль пользователь в настоящее время он работает, но он пахнет..
Я что-то упустил? Я думаю, что самым идеальным вариантом будет стратегия метода расширения, позволяющая сразу вызвать его пользователя, но, похоже, не может сделать эту работу.