다음을 통해 공유


방법: 메타데이터 엔드포인트 보안 설정

서비스의 메타데이터에는 악의적인 사용자가 활용할 수 있는 애플리케이션에 대한 중요한 정보가 들어 있습니다. 또한 서비스의 소비자는 서비스의 메타데이터를 가져오기 위한 보안 메커니즘이 필요할 수도 있습니다. 따라서 보안 엔드포인트를 사용하여 메타데이터를 게시해야 하는 경우가 있습니다.

메타데이터 엔드포인트는 일반적으로 애플리케이션 엔드포인트를 보호하기 위해 WCF(Windows Communication Foundation)에 정의된 표준 보안 메커니즘을 사용하여 보호됩니다. 자세한 내용은 보안 개요를 참조하세요.

이 항목에서는 SSL(Secure Sockets Layer) 인증서 즉, HTTPS 엔드포인트로 보안되는 엔드포인트를 만드는 방법에 대해 단계별로 설명합니다.

코드에 보안 HTTPS GET 메타데이터 엔드포인트를 만들려면

  1. 적절한 X.509 인증서를 사용하여 포트를 구성합니다. 인증서는 신뢰할 수 있는 기관에서 제공해야 하며 "서비스 권한 부여"의 용도가 있어야 합니다. 인증서를 포트에 연결하려면 HttpCfg.exe 도구를 사용해야 합니다. 방법: SSL 인증서를 사용하여 포트 구성을 참조하세요.

    Important

    인증서의 주체 또는 인증서의 DNS(Domain Name System)는 컴퓨터의 이름과 일치해야 합니다. 이는 HTTPS 메커니즘에서 수행하는 첫 번째 단계 중 하나로서 인증서가 호출된 주소와 동일한 URI(Uniform Resource Identifier)에 발급되었는지 확인하는 단계이므로 중요합니다.

  2. ServiceMetadataBehavior 클래스의 새 인스턴스를 만듭니다.

  3. HttpsGetEnabled 클래스의 ServiceMetadataBehavior 속성을 true로 설정합니다.

  4. HttpsGetUrl 속성을 적절한 URL로 설정합니다. 절대 주소를 지정하는 경우 URL은 체계 https://로 시작해야 합니다. 상대 주소를 지정하는 경우 서비스 호스트의 HTTPS 기본 주소를 입력해야 합니다. 이 속성을 설정하지 않으면 기본 주소는 ""이거나 바로 서비스의 HTTPS 기본 주소로 설정됩니다.

  5. 다음 코드에서처럼 Behaviors 클래스의 ServiceDescription 속성이 반환하는 동작 컬렉션에 인스턴스를 추가합니다.

    // Create a new metadata behavior object and set its properties to
    // create a secure endpoint.
    ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
    sb.HttpsGetEnabled = true;
    sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
    myServiceHost.Description.Behaviors.Add(sb);
    
    myServiceHost.Open();
    
    ' Create a new metadata behavior object and set its properties to 
    ' create a secure endpoint. 
    Dim sb As New ServiceMetadataBehavior()
    
    With sb
        .HttpsGetEnabled = True
        .HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint")
    End With
    
    With myServiceHost
        .Description.Behaviors.Add(sb)
        .Open()
    End With
    

구성에 보안 HTTPS GET 메타데이터 엔드포인트를 만들려면

  1. 서비스 구성 파일의 <system.serviceModel> 요소에 <behaviors> 요소를 추가합니다.

  2. <behaviors> 요소에 <serviceBehaviors> 요소를 추가합니다.

  3. <behavior> 요소를 <serviceBehaviors> 요소에 추가합니다.

  4. name 요소의 <behavior> 특성을 적절한 값으로 설정합니다. name 특성은 필수입니다. 아래 예제에서는 mySvcBehavior 값을 사용합니다.

  5. <behavior> 요소에 <serviceMetadata>를 추가합니다.

  6. <serviceMetadata> 요소의 httpsGetEnabled 특성을 true으로 설정합니다.

  7. httpsGetUrl 요소의 <serviceMetadata> 특성을 적절한 값으로 설정합니다. 절대 주소를 지정하는 경우 URL은 체계 https://로 시작해야 합니다. 상대 주소를 지정하는 경우 서비스 호스트의 HTTPS 기본 주소를 입력해야 합니다. 이 속성을 설정하지 않으면 기본 주소는 ""이거나 바로 서비스의 HTTPS 기본 주소로 설정됩니다.

  8. 서비스와 함께 동작을 사용하려면 <service> 요소의 behaviorConfiguration 특성을 동작 요소의 name 특성 값으로 설정합니다. 다음 구성 코드에서는 자세한 예제를 보여 줍니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <system.serviceModel>
      <behaviors>
       <serviceBehaviors>
        <behavior name="mySvcBehavior">
         <serviceMetadata httpsGetEnabled="true"
              httpsGetUrl="https://localhost:8036/calcMetadata" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
     <services>
      <service behaviorConfiguration="mySvcBehavior"
            name="Microsoft.Security.Samples.Calculator">
       <endpoint address="http://localhost:8037/ServiceModelSamples/calculator"
       binding="wsHttpBinding" bindingConfiguration=""
       contract="Microsoft.Security.Samples.ICalculator" />
      </service>
     </services>
    </system.serviceModel>
    </configuration>
    

예시

다음 예제에서는 ServiceHost 클래스의 인스턴스를 만들고 엔드포인트를 추가합니다. 그런 다음 코드는 ServiceMetadataBehavior 클래스의 인스턴스를 만들고, 속성을 설정하여 보안 메타데이터 교환 지점을 만듭니다.

WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Message;
myBinding.Security.Message.ClientCredentialType =
    MessageCredentialType.Windows;

// Create the Type instances for later use and the URI for
// the base address.
Type contractType = typeof(ICalculator);
Type serviceType = typeof(Calculator);
Uri baseAddress = new
    Uri("http://localhost:8037/serviceModelSamples/");

// Create the ServiceHost and add an endpoint.
ServiceHost myServiceHost =
    new ServiceHost(serviceType, baseAddress);
myServiceHost.AddServiceEndpoint
    (contractType, myBinding, "secureCalculator");
// Create a new metadata behavior object and set its properties to
// create a secure endpoint.
ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
sb.HttpsGetEnabled = true;
sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
myServiceHost.Description.Behaviors.Add(sb);

myServiceHost.Open();
// Use the GetHostEntry method to return the actual machine name.
string machineName = System.Net.Dns.GetHostEntry("").HostName ;
Console.WriteLine("Listening @ {0}:8037/serviceModelSamples/", machineName);
Console.WriteLine("Press Enter to close the service");
Console.ReadLine();
myServiceHost.Close();
Dim myBinding As New WSHttpBinding()
With myBinding.Security
    .Mode = SecurityMode.Message
    .Message.ClientCredentialType = MessageCredentialType.Windows
End With

' Create the Type instances for later use and the URI for 
' the base address.
Dim contractType = GetType(ICalculator)
Dim serviceType = GetType(Calculator)
Dim baseAddress As New Uri("http://localhost:8037/serviceModelSamples/")

' Create the ServiceHost and add an endpoint. 
Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")

' Create a new metadata behavior object and set its properties to 
' create a secure endpoint. 
Dim sb As New ServiceMetadataBehavior()

With sb
    .HttpsGetEnabled = True
    .HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint")
End With

With myServiceHost
    .Description.Behaviors.Add(sb)
    .Open()
End With

' Use the GetHostEntry method to return the actual machine name.
Dim machineName = System.Net.Dns.GetHostEntry("").HostName
Console.WriteLine("Listening @ {0}:8037/serviceModelSamples/", machineName)
Console.WriteLine("Press Enter to close the service")
Console.ReadLine()
myServiceHost.Close()

코드 컴파일

코드 예제에서는 다음 네임스페이스를 사용합니다.

참고 항목