다음을 통해 공유


Peer Channel Message Authentication

이 샘플에서는 피어 채널을 사용하여 다자 간 통신을 제공하는 NetPeerTcpBinding 바인딩을 메시지 기반 인증과 함께 사용하는 방법을 보여 줍니다. 이 샘플은 Getting Started 샘플을 변형한 것입니다. WCF(Windows Communication Foundation)에 대한 개요를 보려면 Getting Started 샘플을 참조하십시오.

이 샘플에서 응용 프로그램 인스턴스는 자체 호스팅된 콘솔 응용 프로그램입니다.

다른 전송 바인딩 샘플과 달리 이 샘플에서는 다자 간 통신을 설명할 목적으로 IQuoteChange 계약 인터페이스를 사용합니다. 모든 인스턴스는 이 계약을 구현하여 메시지를 수신하고 동일한 계약의 프록시를 만들어 메시지를 메시로 보냅니다. 이 작업은 메시에 대한 이중 채널을 만들어 수행됩니다.

참고

이 샘플의 설치 절차 및 빌드 지침은 이 항목의 끝부분에 나와 있습니다.

샘플에 있는 바인딩 구성 프로세스를 이해하려면 다음 피어 채널 개념을 알아야 합니다.

  • 피어 확인자는 메시 ID를 메시에 있는 여러 노드의 끝점 주소로 확인합니다.
  • 메시는 피어 노드의 명명된 컬렉션이며 메시 ID로 식별됩니다.
  • 피어 노드는 메시에 참가하는 응용 프로그램의 인스턴스입니다.
  • 메시 ID는 메시의 끝점에 있는 주소의 호스트 부분을 식별합니다. 이러한 주소의 예에는 "net.p2p://chatMesh/servicemodelsamples/chat" 또는 "net.p2p://broadcastMesh/servicemodelsamples/announcements"가 있습니다. chatMesh와 broadcastMesh는 메시 ID입니다.
  • 메시에 참가하는 모든 클라이언트는 같은 메시 ID를 사용하지만 사용하는 경로와 서비스는 다를 수 있습니다. 특정 끝점 주소에 지정된 메시지는 그 주소를 사용하는 모든 클라이언트에 전달됩니다.

피어 노드가 열려 있으면 피어 확인자를 사용하여 메시 ID를 메시에 있는 다른 피어 노드의 주소 목록으로 확인합니다. 이를 통해 메시지를 메시 전체에 전파할 수 있습니다.

PeerTransportCredentialType은 메시에 있는 피어가 서로 인증하는 방식을 지정합니다. 이 속성은 바인딩 구성, NetPeerTcpBinding 개체에서 지정하거나 PeerTransportBindingElement 바인딩 요소를 사용하여 지정할 수 있습니다. 사용 방법에 따라 Peer 속성에 지정된 적절한 자격 증명을 갖는 ClientCredentialSettings 또는 ServiceCredentialSettings 인스턴스를 채널 팩터리 또는 서비스 호스트의 동작 컬렉션에 추가해야 합니다.

피어 채널은 PeerTransportCredentialType 클래스에서 다음과 같은 인증 모드를 지원합니다.

  1. Password. 피어 채널의 기본 인증 모드입니다. 이 모드에서는 메시의 모든 참가자가 암호를 알고 있음을 증명해야 합니다. 이 과정은 인접한 노드 간에 보안 연결을 설정하고 이 암호를 변환하여 교환함으로써 수행됩니다. Password를 지정한 경우 ClientCredentialSettings.Peer 속성은 유효한 암호를 전달하고 SetSelfCertificate를 사용하여 선택적으로 X509Certificate2 인스턴스를 전달해야 합니다.
  2. Certificate. 이 모드에서는 피어 연결을 설정할 때 응용 프로그램 관련 인증이 수행됩니다. 이 모드가 지정된 경우 응용 프로그램은 채널 팩터리에 추가된 ClientCredentialSettings.Peer.PeerAuthenticationX509Certificate2Validator의 구체적인 구현을 지정해야 합니다.

NetPeerTcpBinding.Security.Mode 속성이 SecurityMode.Message 또는 SecurityMode.TransportWithMessageCredential로 설정된 경우 응용 프로그램은 보내는 메시지에 서명하고 들어오는 메시지의 유효성을 검사할 수 있습니다.

보내는 메시지 서명에서는 ClientCredentialSettings.Peer.SetSelfCertificate()로 지정되는 X509Certificate2의 인스턴스를 사용합니다.

메시지 서명은 X509Certificate2 인스턴스를 사용하여 수행합니다. DuplexChannel 또는 OutputChannel의 경우 보내는 메시지 서명을 위해 응용 프로그램에서는 PeerCredential.SetSelfCertificate()를 사용하여 서명에 쓰일 자격 증명을 지정해야 합니다.

InputChannel 또는 DuplexChannel의 경우 들어오는 메시지 확인을 위해 응용 프로그램에서는 메시지 소스의 유효성을 검사하고 ServiceCredentialSettings.Peer.MessageSenderAuthentication()을 통해 지정되는 X509Certificate2Validator의 구체적인 구현을 지정해야 합니다.

바인딩은 발신자와 수신자의 구성 파일에 지정됩니다. 바인딩 형식은 다음 샘플에서와 같이 endpoint 요소의 binding 특성에 지정됩니다.

<services>
    <service name="Microsoft.ServiceModel.Samples.BroadcastReceiver">
        <!-- use base address provided by the host -->
        <endpoint address="Stocks"
            binding="netPeerTcpBinding"
            bindingConfiguration="Binding1" 
            contract="Microsoft.ServiceModel.Samples.IQuoteChange" />
    </service>
</services>

기본 동작과 함께 NetPeerTcpBinding 바인딩을 사용하는 경우 암호 기반 보안이 사용됩니다. binding 요소는 포트, 수신 IP 주소, 확인자 형식, 최대 메시지 크기, 최대 버퍼 풀 크기, 판독기 할당량, 피어 노드 인증 모드, 메시지 인증 및 시간 제한(닫기, 열기, 보내기 및 받기)을 설정하는 특성을 제공합니다.

참고

이 샘플에서는 WCF에서 사용할 수 없는 기본 피어 확인자(PNRP)를 사용하므로 WCF에서 이 샘플을 실행하려면 사용자 지정 피어 확인자를 사용해야 합니다. 다음과 같은 사용자 지정 피어 확인자를 사용하는 샘플을 보려면 Peer Channel Chat를 참조하십시오.

<netPeerTcpBinding>
    <binding configurationName="Binding1"> 
        <resolver mode="Custom">
            <customResolver type=
                  "MyAppNameSpace.MyCustomPeerResolver, myApp"/>
        </resolver>
    </binding>
</netPeerTcpBinding>

MyCustomPeerResolver가 포함된 파일은 발신자 및 수신자와 함께 컴파일되어야 합니다. 플랫폼이 다른 여러 컴퓨터에서 샘플을 실행하는 경우 해당 컴퓨터는 모두 동일한 확인자를 사용해야 합니다.

수신자 및 발신자 구현에서는 수신자 또는 발신자 인스턴스와 연결된 피어 노드를 검색하고 온라인 및 오프라인 이벤트에 등록하는 방법도 보여 줍니다. 온라인 이벤트는 피어 노드가 메시에 있는 하나 이상의 다른 피어 노드에 연결될 때 시작됩니다. 오프라인 이벤트는 피어 노드가 메시에 있는 다른 피어 노드에 더 이상 연결되지 않은 경우에 시작됩니다.

이 경우 피어 채널은 Service Model Metadata Utility Tool (Svcutil.exe)와 통합되지 않습니다. 따라서 Svcutil.exe를 사용하여 발신자에 대해 형식화된 채널을 생성할 수 없습니다.

샘플을 실행하면 발신자는 메시지를 보낼 준비가 되었음을 알리는 메시지를 표시합니다. 값을 입력하고 Enter 키를 눌러 현재 주식 시세를 수신자 클라이언트에 보냅니다. 다른 클라이언트 콘솔 창에 업데이트가 표시됩니다. 클라이언트를 종료하려면 발신자의 콘솔 창에 빈 값을 입력합니다. 또는 수신자 클라이언트에서 Enter 키를 누릅니다.

추적 또는 메시지 로깅을 사용하는 경우 발신자 및 수신자 동작을 보다 자세히 모니터링할 수 있습니다. 다음 절차에서는 추적 및 메시지 로깅을 사용하는 방법을 설명합니다.

참고

이 샘플에서는 현재 인프라에서 throw할 수 있는 모든 예외를 처리하지는 않습니다. 상용/프로덕션 환경에서 이 샘플을 사용할 경우에는 올바른 예외 처리 모범 사례를 따르십시오.

샘플을 설치, 빌드 및 실행하려면

  1. Windows Communication Foundation 샘플의 일회 설치 절차를 수행했는지 확인합니다.

  2. C# 또는 Visual Basic .NET 버전의 솔루션을 빌드하려면 Windows Communication Foundation 샘플 빌드의 지침을 따릅니다.

  3. 단일 컴퓨터 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플 실행의 지침을 따릅니다.

  4. Windows XP SP2에서 PNRP를 설치하려면(일회 설치)

    1. 제어판에서 프로그램 추가/제거를 두 번 클릭합니다.
    2. 프로그램 추가/제거 대화 상자에서 Windows 구성 요소 추가/제거를 클릭합니다.
    3. Windows 구성 요소 마법사에서 네트워킹 서비스 확인란을 선택하고 자세히를 클릭합니다.
    4. 피어-투-피어 확인란을 선택하고 확인을 클릭합니다.
    5. Windows 구성 요소 마법사에서 다음을 클릭합니다.
    6. 설치가 완료되면 마침을 클릭합니다.
    7. 명령 셸 프롬프트에서 net start pnrpsvc 명령을 사용하여 PNRP 서비스를 시작합니다.
  5. 3단계에서 클라이언트 및 서비스를 참조할 때마다 해당 단계가 발신자와 수신자에 적용됩니다.

  6. 이 샘플을 맨 처음 실행하는 경우 Setup.bat를 실행하여 샘플에서 사용하는 인증서를 만들고 등록합니다. 여러 컴퓨터에서 샘플을 사용하는 경우 하나의 컴퓨터에서만 Setup.bat를 실행하고 생성된 인증서를 사용되는 나머지 모든 컴퓨터로 내보냅니다. 이는 Setup.bat에서 임의의 인증서를 만들어 Setup.bat를 실행할 때마다 고유한 인증서를 생성하고 등록하기 때문입니다.

  7. 하나 이상의 수신자와 발신자를 시작합니다. 인스턴스가 연결될 때 발신자 응용 프로그램의 콘솔에 값을 입력하여 수신자에게 업데이트를 보냅니다. 발신자가 보낸 채트 메시지는 모든 수신자가 받습니다.

  8. Cleanup.bat를 실행하여 이 샘플에서 만든 인증서를 제거합니다.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.