2009-12-15 4 views
0

인트라넷에서 Windows 서비스로 실행되는 WCF 서비스가 있고이 서비스에 액세스하는 사용자가 특정 AD 기능 그룹에 속하는지 확인해야합니다. 그건 아주 간단합니다. 그 작업을 수행하는 [OperationContract]로 장식 된 메소드를 호출 할 수 있습니다. 그러나 서비스를 인스턴스화 할 때마다이 검사를 시행 할 수 있습니까? 서비스의 생성자에서 메서드를 호출하려고했지만 작동하지 않는 것 같습니다.AD 기능 그룹이 포함 된 WCF 보안

내 클라이언트는 WinForms 앱이며 기본 폼의 생성자가 훌륭하지 않을 때이 보안 검사를 수행하고 있습니다. 기능 그룹이 변경 될 수 있으므로 WCF 서비스의 app.config 파일에 속성 그룹 이름을 지정하려면 속성에서 기능 그룹 이름을 하드 코드하지 않는 것이 좋습니다.

저는 .NET 3.0에 동의하지 않습니다.

감사

답변

0

기본적으로 WCF 서비스가 될 것입니다 중, 통화 별 또는 세션 당신 bdingin에 따라. 권장되는 가장 좋은 방법은 당 호출하고,이 경우, 각 요청합니다

  • 는 서비스 클래스는
  • 적절한 서비스 방법 인스턴스화됩니다
  • 자신의 완전히 새로운, 별도의 서비스 클래스의 인스턴스를 가져옵니다 상기 서비스 클래스
폐기한다
  • 응답 호출자
  • 로 반환되는 동작 상황에 허가 된 모든 검사를 포함하여 호출 될

    당신은 당신의 서비스 클래스에 간단한 속성을 적용하여 통화 당 인스턴스화를 적용 할 수 있습니다 - 귀하의 서비스 계약의 이행을 :

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    class YourServiceImplementation : IYourServiceContract 
    { 
        ... 
    } 
    

    자세히보기 여기에 주제 :

    Discover Mighty Instance Management Techniques For Developing WCF Apps

  • 0

    인증을 처리하기 위해 ServiceAuthorizationManager를 구현했습니다. 그러나 ServiceAuthorizationManager 메서드가 호출 될 때 Active Directory에 액세스 할 수없는 것 같습니다. 내 서비스의 Thread.CurrentPrincipal.Identity.Name이 비어 있습니다. 나는 이것이 광고를 쿼리 할 때 자격 증명으로 사용될 것이라고 생각합니다. 내 서비스 클래스를 만든 후에도 AD를 쿼리하려고하면 작동하며 Thread.CurrentPrincipal.Identity.Name은 올바르게 채워집니다. 문제는 각각의 [OperationContract] 메서드에서 유효성 검사를 수행해야만하는 것입니다.

    public static void CheckPermissions(List<string> RequiredGroupNames) 
        { 
         bool ThrowException; 
         WindowsIdentity MyIdentity = OperationContext.Current.ServiceSecurityContext.WindowsIdentity; 
         WindowsPrincipal p = new WindowsPrincipal(MyIdentity); 
         ThrowException = true; 
         foreach (string RequiredGroupName in RequiredGroupNames) 
         { 
          if (p.IsInRole(RequiredGroupName)) 
          { 
           ThrowException = false; 
          } 
         } 
         if (ThrowException == true) 
         { 
          throw new FaultException(MyIdentity.Name + ": You don't have permission for this operation!"); 
         } 
        } 
    

    내가 OP로 .NET 4.0하지만,하지 3.0을 사용 :

    0

    내가이 고대 질문이지만, 대답을해야 할 수 있습니다 사람들을 위해 실현, 여기에 내가이 작업을 수행하는 데 사용하는 코드입니다 정해진. 그러나 누군가가 도움이 되었기를 바랍니다.