13

관리자 패널에서 역할이 동적으로 설정되는 간단한 CMS를 구축 중입니다. 예를 들어 [Authorize(Roles="admin")]을 추가하는 컨트롤러 메소드를 인증하는 기존의 방법은 더 이상 충분하지 않습니다. 역할 - 작업 관계는 최종 사용자가 관리 패널에서 다른 사용자와 쉽게주고받을 수 있도록 데이터베이스에 저장되어야합니다. 어떻게 구현할 수 있습니까?ASP.NET MVC - 동적 인증

답변

0

ASP.NET 멤버십/프로필 기능이 제공하는 기능입니다. 그리고 Authorize 속성과 함께 작동합니다.

자신을 롤업하려는 경우 표준 인증 조치 필터의 동작을 모방 한 사용자 정의 조치 필터를 작성할 수 있습니다. 아래의 의사 코드.

public MyAuthorizeAttribute : ActionFilterAttribute 
{ 
    public string MyRole { get; set; } 

    public void OnActionExecuting(ControllerContext context) 
    { 
     if (!(bool)Session["userIsAuthenticated"]) 
     { 
      throw new AuthenticationException("Must log in."); 
     } 

     if (!Session["userRoles"].Contains(MyRole)) 
     { 
      throw new AuthenticationException("Must have role " + MyRole); 
     } 
    } 
} 
+0

나는 그 일에 아주 익숙하지 만 코드에서 역할이 구체적으로 할당 된 예제를 보았습니다. 예를 들어, 일부 클라이언트는 특정 권한을 가진 "Engineer"라는 사용자 그룹을 가질 수 있습니다. 코드 조각을 건드리지 않고 관리자 패널에서 설정할 수 있기를 바랍니다. 지금 당장은 표준 인증 특성을 사용하는 방법을 볼 수 없습니다 – xantrus

+0

감사합니다. 나는 그것을 조사 할 것입니다. – xantrus

+0

그러면 데이터베이스에 조회를 추가해야하는데, 아마도 사용자와 컨트롤러를 일치시켜야 할 것입니다/DB에있는 액세스 규칙이있는 작업 이름. 아니면 그런 식으로. – rmac

0

역할 - 액션 관계는 는 데이터베이스에 저장해야합니다

당신은 당신이 위로 보이도록 AuthorizeAttribute를 서브 클래 싱하지 않으려면, 컨트롤러 메서드 내에서 보안을 확인해야합니다

당신을위한 데이터베이스의 역할.

18

인증 프로세스를 제어하려면 AuthorizeAttribute의 하위 클래스를 지정하고 AuthorizeCore 메서드를 재정의해야합니다. 그런 다음 컨트롤러를 기본값 대신 CmsAuthorizeAttribute으로 꾸미십시오.

public class CmsAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override virtual bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     IPrincipal user = httpContext.User; 
     IIdentity identity = user.Identity; 

     if (!identity.IsAuthenticated) { 
      return false; 
     } 

     bool isAuthorized = true; 
     // TODO: perform custom authorization against the CMS 


     return isAuthorized; 
    } 
} 

이의 단점은 당신이 ctor에 주입 IOC의에 액세스 할 수 없습니다, 그래서 당신은 직접 컨테이너에서 종속성을 요청해야한다는 것입니다.

+0

컨테이너에서 직접 종속성을 얻는 단점은 무엇입니까? 내 RoleProvider 구현을 위해 이걸 가지고 있었어 ... – Haroon

+1

@Haroon - 단점은 디자인 중 하나입니다. 일반적으로 IoC 컨테이너에 대한 의존성을 줄이려면 코드가 IoC 컨테이너를 모르는 사이에 모범 사례로 간주됩니다. 예를 들어 성능상의 이유로 반사 기반 컨테이너를 일반적으로 피하는 WP7에서 코드를 다시 사용할 수 있습니다. –

+0

@Haroon - MVC 3은 속성으로 장식 된 속성을 통해 필터 속성 삽입을 지원합니다. 컨테이너에 대한 지식이 여전히 필요하지만 쉽게 조롱 당합니다. –