방법: 최대 클럭 오차 설정
두 개의 컴퓨터에서 클록 설정이 서로 다른 경우 시간 중심 기능이 비활성화될 수 있습니다. 이 가능성을 줄이기 위해 MaxClockSkew
설정을 TimeSpan으로 설정할 수 있습니다. 이 속성은 다음 두 개의 클래스에서 사용할 수 있습니다.
Important
보안 대화를 위해 서비스 또는 클라이언트가 부트스트랩될 때 MaxClockSkew
속성을 변경해야 합니다. 이렇게 하려면 SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement 속성에서 반환된 SecurityBindingElement에 속성을 설정해야 합니다.
시스템 제공 바인딩 중 하나에서 속성을 변경하려면 바인딩 컬렉션에서 보안 바인딩 요소를 찾아 MaxClockSkew
속성을 새 값으로 설정합니다. 두 개의 클래스는 SecurityBindingElement: SymmetricSecurityBindingElement 및 AsymmetricSecurityBindingElement에서 파생됩니다. 컬렉션에서 보안 바인딩을 검색하는 경우 MaxClockSkew
속성을 제대로 설정하기 위해 이러한 형식 중 하나를 캐스팅해야 합니다. 다음 예제에서는 WSHttpBinding를 사용하는 SymmetricSecurityBindingElement을 사용합니다. 각 시스템 제공 바인딩에 사용할 보안 바인딩 형식을 지정하는 목록은 시스템 제공 바인딩을 참조하세요.
코드에서 새 클럭 오차 값으로 사용자 지정 바인딩을 만들려면
Warning
코드에서 System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissions 및 System.ServiceModel.Security.Tokens 네임스페이스에 대한 참조를 추가합니다.
WSHttpBinding 클래스의 인스턴스를 만들고 보안 모드를 SecurityMode.Message로 설정합니다.
BindingElementCollection 메서드를 호출하여 CreateBindingElements 클래스의 새 인스턴스를 만듭니다.
Find 클래스의 BindingElementCollection 메서드를 사용하여 보안 바인딩 요소를 찾습니다.
Find 메서드를 사용하는 경우 실제 형식으로 캐스팅합니다. 아래 예제에서는 SymmetricSecurityBindingElement 형식으로 캐스팅합니다.
보안 바인딩 요소에서 MaxClockSkew 속성을 설정합니다.
적절한 서비스 형식 및 기본 주소로 ServiceHost를 만듭니다.
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를 설정하려면
<bindings> 요소 섹션에서 <customBinding>을 만듭니다.
<binding> 요소를 만들고
name
특성을 적절한 값으로 설정합니다. 다음 예제에서는 이 특성을MaxClockSkewBinding
으로 설정합니다.인코딩 요소를 추가합니다. 아래 예에서는 <textMessageEncoding>을 추가합니다.
<security> 요소를 추가하고
authenticationMode
특성을 적절한 설정으로 설정합니다. 다음 예제에서는 특성을Kerberos
로 설정하여 서비스가 Windows 인증을 사용하도록 지정합니다.<localServiceSettings>를 추가하고
maxClockSkew
특성을"##:##:##"
형식의 값으로 설정합니다. 다음 예제에서는 이 특성을 7분으로 설정합니다. 선택적으로 <localServiceSettings>를 추가하고maxClockSkew
특성을 적절하게 설정합니다.전송 요소를 추가합니다. 다음 예에서는 <httpTransport>를 사용합니다.
보안 대화의 경우 보안 설정이 <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>