나는보다 이상적인 전략으로 나를 안내하기 위해 누군가가 도움을 줄 수있는 아키텍처 문제가 있습니다. 내가 "코드 냄새"의 냄새를 맡도록 강요당한 방식.ASP.NET의 사용자 지정 역할 아키텍처 MVC 5, 종속성 주입 문제
"역할"에는 두 가지 종류가 있습니다. 내장 된 ID 역할이 있고 사용자 지정 역할 세트 (사용자 그룹 역할)가 있습니다. 기본적으로 사용자 ID, 사용자 그룹 역할 ID 및 사용자 그룹 ID 간의 관계를 데이터베이스에 저장합니다. 특정 사용자 그룹 역할을 가진 사용자를 사용자 그룹에 할당하는 모든 CRUD 작업을 처리하는 내 UserGroupService의 종속성 주입에 Ninject를 사용하고 있습니다.
첫 번째 공격 계획은 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);
}
여기서 문제는 내가이에게 나는 사용자가 현재 역할의 어떤 종류의 의미가 있습니다 결정하기 위해 원하는 시간을 할 필요가 있다는 것입니다,하지만 냄새가 난다.
여기에 뭔가가 있습니까? 가장 이상적인 옵션은 User에서 바로 호출 할 수있는 확장 방법 전략이지만이 작업을 수행 할 수는 없다고 생각합니다.