2011-09-20 3 views
5

Ive에 여러 웹 메소드가있는 WCF 서비스가 있습니다. 모든 방법에 대한 요청을 가로 채고 IP 주소를보고 싶습니다. Id는 오히려 각 호출 된 웹 메소드의 맨 위에있는 메소드 호출에 논리를 두지 않으므로이 메소드에 대한 모든 호출을 한 곳에서 인터셉트 할 수있는 방법이 있습니까?WCF .svc 서비스의 메서드 호출을 모두 차단할 수 있습니까?

페이지 인 경우 기본 페이지 개체를 작성하지만 wcf 호출에서 발생하는 이벤트가 있는지 확실하게 알 수 있습니까?

+0

WCF의 [관리자] (https://web.archive.org/web/20120207232924/http://cgeers.com:80/2008/11/09/wcf-extensibility-parameter)에서 관리자를 사용할 수 있습니다. -inspectors /) – dhinesh

+0

@dhinesh의 위 설명 링크는 악성 코드가있는 페이지를로드하는 것으로 보였으며 Chrome 확장 프로그램을 설치하라고했습니다. 나는 그것을 사회자에게보고했다. – Volomike

+0

귀하의 질문은 asp.net보다 훨씬 광범위하고 .NET과 함께 C# 코더 및 VB 코더에 매우 유용 할 수 있으므로 asp.net 태그를 제거 할 것을 제안합니다. – Volomike

답변

3

WCF를 사용하면 스택에 추가되는 인터셉터를 구현할 수 있습니다. 예를 들어 link을 참조하십시오. 나는 이것이 당신에게 보낸 사람의 IP를 추출 할 수 있는지 여부를 확신하지 못했지만, 시도해 볼만한 가치가 있다고 생각합니다.

3

IDispatchMessageInspector를 구현하고 이와 유사한 작업을 수행 할 수 있습니다.

public object AfterReceiveRequest(ref Message request, 
IClientChannel channel, InstanceContext instanceContext) 
    { 
     RemoteEndpointMessageProperty remoteEndpoint = request.Properties 
    [RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 

     //remoteEndpoint.Address will give you the address. 

     return null; 
    } 
+0

'host.Open()'호출 전에 WCF 서비스에 이것을 첨부하는 쉬운 방법이 있습니까? 내가 본 유일한 사실은 특수 동작, 바인딩 및 메시지 관리자를 만들어야한다는 것입니다. 나는 이것을 이해하려고 내 머리카락을 찢고 궁극적으로 포기했다. 그런 다음'ServiceAuthorizationManager'를 발견했습니다. – Volomike

1

ServiceAuthorizationManager이 할 수있는 영리한 방법이, 그리고 그것은 IDispatchMessageInspector의 모든 진지하게 노력보다 훨씬 쉽다.

지금처럼 WCF 서비스 프로젝트의 클래스를 만듭니다 :

public class MyServiceAuthorizationManager : ServiceAuthorizationManager 
{ 
    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
    string classMethod = operationContext.RequestContext.RequestMessage.Headers.Action; 
    if (classMethod.Contains("/transfer/Get")) 
    { 
     return true; // because someone is simply updating a client service reference 
    } 
    Console.WriteLine("Class Method Call: {0}",classMethod); 
    // do something with operationContext here as you need to inspect stuff 
    // return true if you want this class method call to succeed and go through 
    // return false if you want this class method to fail on the client 
    return true; 
    } 
} 

다음, 당신의 서비스에, 바로 host.Open() 호출하기 전에, MyServiceAuthorizationManager에 대한 링크를 추가 할 수 있습니다.

ServiceHost host = new ServiceHost(typeof(MyProject.Service1)); 
host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager(); 
host.Open(); 

이제 클라이언트 연결을 테스트하면 콘솔에서 호출 된 클래스 메서드가 출력됩니다. 또한 operationContext 객체의 모든 내용에 대해 작업 할 수 있습니다.

내가 사용하는 한 가지 방법은 보안 헤더 확인을위한 것입니다. 내 의뢰인은 헤더를 추가합니다. 그런 다음이 서비스에서이 CheckAccessCore() 호출에서이 사용자 지정 헤더가 있는지 확인합니다. 그렇지 않으면 거짓을 반환합니다. 이것은 해커를 차단하는 또 하나의 보호 계층이며 Named Pipe 구성의 제한된 보안에도 유용합니다. 원하는 경우 사용자 정의 헤더를 추가하는 방법에 대한 자세한 내용은 click here을 참조하십시오.이 헤더는 서비스의 모든 클라이언트 메소드 호출시 자동으로 전송됩니다.

이 모든 것 중에서, 나는 행동, 주장, 청취자 또는 메시지 발송을 망칠 필요가 없었습니다. WCF 구성을 편집 할 필요도 없었습니다.

위의 /transfer/Get에 대한 문자열 검사에 유의하십시오. 나가 인 것처럼 당신이 안전 기계 장치로 우두머리 수표를하고있는 경우에 이것은 중요하다. 해당 조건이없고 true를 반환하지 않으면 IDE에서 해당 추가 헤더를 알 수 없기 때문에 WCF 클라이언트 IDE는 ServiceReference을 업데이트 할 수 없습니다 (사용자 지정 헤더를 추가하고 해당 헤더를 WCF 클라이언트의 app.config). 그렇지 않으면 The URI prefix is not recognized 오류가 발생합니다.

관련 문제