는 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
오류가 발생합니다.
WCF의 [관리자] (https://web.archive.org/web/20120207232924/http://cgeers.com:80/2008/11/09/wcf-extensibility-parameter)에서 관리자를 사용할 수 있습니다. -inspectors /) – dhinesh
@dhinesh의 위 설명 링크는 악성 코드가있는 페이지를로드하는 것으로 보였으며 Chrome 확장 프로그램을 설치하라고했습니다. 나는 그것을 사회자에게보고했다. – Volomike
귀하의 질문은 asp.net보다 훨씬 광범위하고 .NET과 함께 C# 코더 및 VB 코더에 매우 유용 할 수 있으므로 asp.net 태그를 제거 할 것을 제안합니다. – Volomike