5

많은 블로그 게시물과 stackoverflow 답변을 읽었지 만 여전히 클레임 기반 인증 및 권한 부여를 사용하는 실제 공개 소스 프로젝트를 찾을 수 없어 실제로 이것을 구현하는 방법에 대한 아이디어.ASP.NET MVC의 클레임 기반 권한 부여

지금까지 내가 알 수있는 것은 Thinktecture.IdentityModelthis blog은 샘플 웹 사이트에서 소유권 주장 기반 인증을 구현합니다. 여러분이 클레임을 사용하는 일부 오픈 소스 프로젝트를 가르쳐 주실 수 있다면 정말 도움이 될 것입니다.

내가 아는 것은 데이터베이스를 사용하는 응용 프로그램에 대한 클레임을 검색하는 방법입니다.

지금까지 내가 시도한 것은 데이터베이스에있는 메모리 클레임을 사용하여 CustomClaimsTransformerCustomAuthorisationManager과 같은 것을 만들었습니다.

public class CustomClaimsTransformer : ClaimsAuthenticationManager 
    { 
     public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
     { 
      //validate name claim 
      string nameClaimValue = incomingPrincipal.Identity.Name; 

      return CreatePrincipal(nameClaimValue); 
     } 

     private ClaimsPrincipal CreatePrincipal(string userName) 
     { 
      int userId = ClaimStore.Users.First(u => u.Value == userName).Key; 
      var claims = ClaimStore.ClaimsSet.Where(c => c.Key == userId); 

      var claimsCollection = claims.Select(kp => kp.Value).ToList(); 

      return new ClaimsPrincipal(new ClaimsIdentity(claimsCollection, "Custom")); 
     } 
    } 

public class CustomAuthorisationManager : ClaimsAuthorizationManager 
    { 
     public override bool CheckAccess(AuthorizationContext context) 
     { 
      string resource = context.Resource.First().Value; 
      string action = context.Action.First().Value; 

      if (action == "Show" && resource == "Code") 
      { 
       bool likesJava = context.Principal.HasClaim(ClaimStore._httpMyclaimsUsers, "True"); 
       return likesJava; 
      } 
      else if (action == "Read" && resource == "Departments") 
      { 
       bool readDeps = context.Principal.HasClaim(ClaimStore._httpMyclaimsDepartments, "Read"); 
       return readDeps; 
      } 
      return false; 
     } 
    } 

너무 많은 IF 조건을 사용하지 않고 실제 시나리오에서이를 구현하는 방법은 무엇입니까?

+0

어떻게 끝냈습니까? 당신은 대답을 제공해주십시오. – Moes

답변

0

마침내 필자는 기존 asp.net ID 2.0 테이블을 사용하여 필요한 기능을 갖춘 자체 시스템을 설계하고 내 자신을 약간 수정했습니다.

모든 AREA-CONTROLLER-ACTION 트리오를 내 시스템의 리소스로 호출 할 것입니다. WebAPI가 포함되어 있습니다. 지역 자체는 자원입니다. 컨트롤러 자체는 리소스입니다. 행동 그 자체는 하나의 자원입니다. 그것들의 어떤 조합도 자원입니다. 리플렉션을 사용하여 시스템 자체에서 모든 것을 자동 생성합니다.

또한 사용자 그룹을 저장하기 위해 동일한 AspNetRoles 테이블을 사용할 것입니다. 사용자는 하나 이상의 그룹 (최고 관리자, 관리자, 에이전트, 클라이언트 등)에 속합니다.

기존 역할 기반 모델을 소유권 주장이있는 사용자 그룹 기반 모델로 사용하면 정상적으로 작동 할 수 있습니다. 최고 관리자는 신 모드입니다. 하위 수준의 사용자/그룹/권한 할당 등을 만들 수 있습니다.

사용자는 특별한 권한을 가질 수 있습니다. 예를 들어, 상담원 그룹의 모든 사람은 호텔 업데이트에 대한 액세스가 거부되지만 호텔의 소유자 일 수도있는 특수 요원에게 호텔 만 업데이트 할 수 있습니다.

전체 액세스 제어 시스템이 MVC 영역 컨트롤러 액션 세트에서 실행되기 때문에. 처음에는 아무도 액세스 권한이 없으며 (수퍼 관리자 포함) 그룹/사용자가 액세스 할 수있는 부분을 점차 정의합니다. 그리고 우리는 수퍼 관리자와 관리자에게 클레임을 통해 독점적 인 액세스 권한을 부여합니다. 기본적으로 모든 곳의 액세스가 거부됩니다.

자동으로 AREA-CONTROLLER-ACTION 세트가 생성되면 사용자가 어떤 그룹에 어떤 항목에 대한 액세스 권한이 있는지 선택하게합니다.

사용자가 로그인하면 현재 사용자가 액세스 할 수있는 모든 리소스를 가져 와서 클레임으로 저장합니다. 이를 기반으로 클레임 인증 관리자를 사용하여 사용자가 일부 리소스에 대한 액세스를 요청할 때 자신의 소유권을 확인하고 액세스 권한을 부여해야하는지 결정할 수 있습니다.

foreach(var claim in permissionClaims) { 
    var parts = claim.Value.Split(new [] { 
     '|' 
    }, StringSplitOptions.None); 
    if (parts.Length == 3) { 
     //var httpMethod = parts[0]; 
     var action = parts[1]; 
     var api = parts[2]; 
     //Current.Log.Warn("Checking Access : " + req + " [action: " + action + "]"); 
     // is this request for a API action? 
     if (api.Contains("API")) { 
      // if so, req must be for a API action 
      if (req.Contains("Api") && action.Contains(req)) { 
       Log.Trace("User has access to API : " + req + " [action: " + action + "]"); 
       return true; 
      } 
     } else { 
      // this is for a MVC action 
      if (action.Contains(req)) { 
       Log.Trace("User has access to MVC : " + req + " [action: " + action + "]"); 
       return true; 
      } 
     } 
    } 
} 

나는 접근 방식을 자세히 설명했다. here - ASP.NET MVC Fine Grained Identity & Access Control.

+0

이론적으로는 질문에 대답 할 수 있지만 여기에 답변의 핵심 부분을 포함 시키려면 (// meta.stackoverflow.com/q/8259) 바람직합니다. 참조 용 링크. –

2

다음 링크를 시도, 그것은 또한

http://developers.axiomatics.com/blog/index/entry/custom-claims-based-authorization-in-net-using-axiomatics-pep-sdk-for-net.html

당신이 당신의 정책을 정의하고로드 할 수 있습니다 괜찮은 솔루션 것 같아 방법이

http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.loadcustomconfiguration.aspx

: A의 클레임 인증을 구현 WIF 및 ACS를 사용하는 클레임 ​​인식 ASP.NET 응용 프로그램 http://msdn.microsoft.com/en-us/library/gg185907.aspx

+0

이 귀중한 자원을 가져 주셔서 감사합니다. 유망한 각각의 Axiomatics SDK 사운드를 살펴 보았지만 사용하지는 않습니다. web.config 또는 데이터베이스에 정의 된 정책을 사용하여 사용자 지정 구현을 수행해야합니다. 규칙 평가 방법을 이해하지 못합니다. –

+0

(면책 조항 - 저는 Axiomatics에서 일하고 있습니다.) 맞춤 구현을 위해가는 것은 결코 좋은 방법이 아닙니다. 단순한 것부터 복잡한 것까지 다양한 범위의 인증을 처리 할 수있는 많은 프레임 워크가 있습니다. Microsoft는 심지어 클레임 기반 authZ를 기본 제공합니다. 자신 만의 구현은 명확한 방법이 아닙니다. –