다음을 통해 공유


방법: 최대 클럭 오차 설정

두 개의 컴퓨터에서 클록 설정이 서로 다른 경우 시간 중심 기능이 비활성화될 수 있습니다. 이 가능성을 줄이기 위해 MaxClockSkew 설정을 TimeSpan으로 설정할 수 있습니다. 이 속성은 다음 두 개의 클래스에서 사용할 수 있습니다.

LocalClientSecuritySettings

LocalServiceSecuritySettings

Important

보안 대화를 위해 서비스 또는 클라이언트가 부트스트랩될 때 MaxClockSkew 속성을 변경해야 합니다. 이렇게 하려면 SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement 속성에서 반환된 SecurityBindingElement에 속성을 설정해야 합니다.

시스템 제공 바인딩 중 하나에서 속성을 변경하려면 바인딩 컬렉션에서 보안 바인딩 요소를 찾아 MaxClockSkew 속성을 새 값으로 설정합니다. 두 개의 클래스는 SecurityBindingElement: SymmetricSecurityBindingElementAsymmetricSecurityBindingElement에서 파생됩니다. 컬렉션에서 보안 바인딩을 검색하는 경우 MaxClockSkew 속성을 제대로 설정하기 위해 이러한 형식 중 하나를 캐스팅해야 합니다. 다음 예제에서는 WSHttpBinding를 사용하는 SymmetricSecurityBindingElement을 사용합니다. 각 시스템 제공 바인딩에 사용할 보안 바인딩 형식을 지정하는 목록은 시스템 제공 바인딩을 참조하세요.

코드에서 새 클럭 오차 값으로 사용자 지정 바인딩을 만들려면

Warning

코드에서 System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.PermissionsSystem.ServiceModel.Security.Tokens 네임스페이스에 대한 참조를 추가합니다.

  1. WSHttpBinding 클래스의 인스턴스를 만들고 보안 모드를 SecurityMode.Message로 설정합니다.

  2. BindingElementCollection 메서드를 호출하여 CreateBindingElements 클래스의 새 인스턴스를 만듭니다.

  3. Find 클래스의 BindingElementCollection 메서드를 사용하여 보안 바인딩 요소를 찾습니다.

  4. Find 메서드를 사용하는 경우 실제 형식으로 캐스팅합니다. 아래 예제에서는 SymmetricSecurityBindingElement 형식으로 캐스팅합니다.

  5. 보안 바인딩 요소에서 MaxClockSkew 속성을 설정합니다.

  6. 적절한 서비스 형식 및 기본 주소로 ServiceHost를 만듭니다.

  7. ph x="1" /> 메서드를 사용하여 엔드포인트를 추가하고 CustomBinding을 포함합니다.

    // This method returns a custom binding created from a WSHttpBinding. Alter the method
    // to use the appropriate binding for your service, with the appropriate settings.
    public static Binding CreateCustomBinding(TimeSpan clockSkew)
    {
        WSHttpBinding standardBinding = new WSHttpBinding(SecurityMode.Message, true);
        CustomBinding myCustomBinding = new CustomBinding(standardBinding);
        SymmetricSecurityBindingElement security =
            myCustomBinding.Elements.Find<SymmetricSecurityBindingElement>();
        security.LocalClientSettings.MaxClockSkew = clockSkew;
        security.LocalServiceSettings.MaxClockSkew = clockSkew;
        // Get the System.ServiceModel.Security.Tokens.SecureConversationSecurityTokenParameters
        SecureConversationSecurityTokenParameters secureTokenParams =
            (SecureConversationSecurityTokenParameters)security.ProtectionTokenParameters;
        // From the collection, get the bootstrap element.
        SecurityBindingElement bootstrap = secureTokenParams.BootstrapSecurityBindingElement;
        // Set the MaxClockSkew on the bootstrap element.
        bootstrap.LocalClientSettings.MaxClockSkew = clockSkew;
        bootstrap.LocalServiceSettings.MaxClockSkew = clockSkew;
        return myCustomBinding;
    }
    
    private void Run()
    {
        // Create a custom binding using the method defined above. The MaxClockSkew is set to 30 minutes.
        Binding customBinding= CreateCustomBinding(TimeSpan.FromMinutes(30));
    
        // Create a ServiceHost instance, and add a metadata endpoint.
        // NOTE  When using Visual Studio, you must run as administrator.
        Uri baseUri = new Uri("http://localhost:1008/");
        ServiceHost sh = new ServiceHost(typeof(Calculator), baseUri);
    
        // Optional. Add a metadata endpoint. The method is defined below.
        AddMetadataEndpoint(ref sh);
    
        // Add an endpoint using the binding, and open the service.
        sh.AddServiceEndpoint(typeof(ICalculator), customBinding, "myCalculator");
    
        sh.Open();
        Console.WriteLine("Listening...");
        Console.ReadLine();
    }
    
    private void AddMetadataEndpoint(ref ServiceHost sh)
    {
        Uri mex = new Uri(@"http://localhost:1001/metadata/");
        ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
        sm.HttpGetEnabled = true;
        sm.HttpGetUrl = mex;
        sh.Description.Behaviors.Add(sm);
    }
    
    
    ' This method returns a custom binding created from a WSHttpBinding. Alter the method 
    ' to use the appropriate binding for your service, with the appropriate settings.
    Public Shared Function CreateCustomBinding(ByVal clockSkew As TimeSpan) As Binding
    
        Dim standardBinding As WSHttpBinding = New WSHttpBinding(SecurityMode.Message, True)
        Dim myCustomBinding As CustomBinding = New CustomBinding(standardBinding)
        Dim security As SymmetricSecurityBindingElement = _
            myCustomBinding.Elements.Find(Of SymmetricSecurityBindingElement)()
        security.LocalClientSettings.MaxClockSkew = clockSkew
        security.LocalServiceSettings.MaxClockSkew = clockSkew
        ' Get the System.ServiceModel.Security.Tokens.SecureConversationSecurityTokenParameters 
        Dim secureTokenParams As SecureConversationSecurityTokenParameters = _
             CType(security.ProtectionTokenParameters, SecureConversationSecurityTokenParameters)
        ' From the collection, get the bootstrap element.
        Dim bootstrap As SecurityBindingElement = secureTokenParams.BootstrapSecurityBindingElement
        ' Set the MaxClockSkew on the bootstrap element.
        bootstrap.LocalClientSettings.MaxClockSkew = clockSkew
        bootstrap.LocalServiceSettings.MaxClockSkew = clockSkew
        Return myCustomBinding
    End Function
    
    Private Sub Run()
    
        ' Create a custom binding using the method defined above. The MaxClockSkew is set to 30 minutes. 
        Dim customBinding As Binding = CreateCustomBinding(TimeSpan.FromMinutes(30))
    
        ' Create a ServiceHost instance, and add a metadata endpoint.
        ' NOTE  When using Visual Studio, you must run as administrator.
        Dim baseUri As New Uri("http://localhost:1008/")
        Dim sh As New ServiceHost(GetType(Calculator), baseUri)
    
        ' Optional. Add a metadata endpoint. The method is defined below.
        AddMetadataEndpoint(sh)
    
        ' Add an endpoint using the binding, and open the service.
        sh.AddServiceEndpoint(GetType(ICalculator), customBinding, "myCalculator")
    
        sh.Open()
        Console.WriteLine("Listening...")
        Console.ReadLine()
    End Sub
    
    Private Sub AddMetadataEndpoint(ByRef sh As ServiceHost)
    
        Dim mex As New Uri("http://localhost:1011/metadata/")
        Dim sm As New ServiceMetadataBehavior()
        sm.HttpGetEnabled = True
        sm.HttpGetUrl = mex
        sh.Description.Behaviors.Add(sm)
    End Sub
    
    

구성에서 MaxClockSkew를 설정하려면

  1. <bindings> 요소 섹션에서 <customBinding>을 만듭니다.

  2. <binding> 요소를 만들고 name 특성을 적절한 값으로 설정합니다. 다음 예제에서는 이 특성을 MaxClockSkewBinding으로 설정합니다.

  3. 인코딩 요소를 추가합니다. 아래 예에서는 <textMessageEncoding>을 추가합니다.

  4. <security> 요소를 추가하고 authenticationMode 특성을 적절한 설정으로 설정합니다. 다음 예제에서는 특성을 Kerberos로 설정하여 서비스가 Windows 인증을 사용하도록 지정합니다.

  5. <localServiceSettings>를 추가하고 maxClockSkew 특성을 "##:##:##" 형식의 값으로 설정합니다. 다음 예제에서는 이 특성을 7분으로 설정합니다. 선택적으로 <localServiceSettings>를 추가하고 maxClockSkew 특성을 적절하게 설정합니다.

  6. 전송 요소를 추가합니다. 다음 예에서는 <httpTransport>를 사용합니다.

  7. 보안 대화의 경우 보안 설정이 <secureConversationBootstrap> 요소의 부트스트랩에서 수행되어야 합니다.

    <bindings>  
      <customBinding>  
        <binding name="MaxClockSkewBinding">  
            <textMessageEncoding />  
            <security authenticationMode="Kerberos">  
               <localClientSettings maxClockSkew="00:07:00" />  
               <localServiceSettings maxClockSkew="00:07:00" />  
               <secureConversationBootstrap>  
                  <localClientSettings maxClockSkew="00:30:00" />  
                  <localServiceSettings maxClockSkew="00:30:00" />  
               </secureConversationBootstrap>  
            </security>  
            <httpTransport />  
        </binding>  
      </customBinding>  
    </bindings>  
    

참고 항목