Nasıl yapılır: Maksimum Saat Eğriltme Ayarlama
İki bilgisayarda saat ayarları farklıysa, zaman açısından kritik işlevler raydan çıkarılabilir. Bu olasılığı azaltmak için özelliğini olarak TimeSpanayarlayabilirsinizMaxClockSkew
. Bu özellik iki sınıfta kullanılabilir:
Önemli
Güvenli bir konuşma için, hizmet veya istemci önyüklemesi yapıldığında özelliğinde değişiklikler MaxClockSkew
yapılmalıdır. Bunu yapmak için özelliği tarafından SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement döndürülen üzerinde SecurityBindingElement ayarlamanız gerekir.
Sistem tarafından sağlanan bağlamalardan birinde özelliğini değiştirmek için, bağlama koleksiyonunda güvenlik bağlaması öğesini bulmanız ve özelliğini yeni bir değere ayarlamanız MaxClockSkew
gerekir. İki sınıf : SymmetricSecurityBindingElement ve AsymmetricSecurityBindingElement'den SecurityBindingElementtüretilir. Güvenlik bağlamasını koleksiyondan alırken, özelliği doğru şekilde ayarlamak için bu türlerden birine dönüştürmeniz MaxClockSkew
gerekir. Aşağıdaki örnek, SymmetricSecurityBindingElementkullanan bir WSHttpBindingkullanır. Sistem tarafından sağlanan her bağlamada kullanılacak güvenlik bağlaması türünü belirten bir liste için bkz . Sistem Tarafından Sağlanan Bağlamalar.
Kodda yeni bir saat dengesizliği değeriyle özel bağlama oluşturmak için
Uyarı
Kodunuzda aşağıdaki ad alanlarına başvurular ekleyin: System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissionsve System.ServiceModel.Security.Tokens.
Bir WSHttpBinding sınıfın örneğini oluşturun ve güvenlik modunu olarak SecurityMode.Messageayarlayın.
yöntemini çağırarak sınıfının yeni bir örneğini BindingElementCollectionCreateBindingElements oluşturun.
Find Güvenlik bağlama öğesini bulmak için sınıfının yöntemini BindingElementCollection kullanın.
yöntemi kullanılırken Find gerçek türe yayın. Aşağıdaki örnek türüne yayınlar SymmetricSecurityBindingElement .
MaxClockSkew Güvenlik bağlama öğesinde özelliğini ayarlayın.
Uygun hizmet türüne ve temel adrese sahip bir ServiceHost oluşturun.
AddServiceEndpoint Bir uç nokta eklemek ve CustomBindingeklemek için yöntemini kullanın.
// 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
Yapılandırmada MaxClockSkew'i ayarlamak için
Bağlamalar öğesi bölümünde customBinding ><<oluşturun.>
Bağlama <>öğesi oluşturun ve özniteliğini
name
uygun bir değere ayarlayın. Aşağıdaki örnek bunu olarakMaxClockSkewBinding
ayarlar.Bir kodlama öğesi ekleyin. Aşağıdaki örnekte textMessageEncoding <eklenmiştir>.
Bir <güvenlik> öğesi ekleyin ve özniteliğini
authenticationMode
uygun bir ayara ayarlayın. Aşağıdaki örnek, hizmetin Windows kimlik doğrulaması kullandığını belirtmek için özniteliğiniKerberos
olarak ayarlar.localService <Ayarlar> ekleyin ve özniteliğini biçiminde
"##:##:##"
bir değere ayarlayınmaxClockSkew
. Aşağıdaki örnek bunu 7 dakikaya ayarlar. İsteğe bağlı olarak, localService <Ayarlar> ekleyin ve özniteliğini uygun bir ayara ayarlayınmaxClockSkew
.Bir aktarım öğesi ekleyin. Aşağıdaki örnekte httpTransport <>kullanılır.
Güvenli bir konuşma için güvenlik ayarlarının secureConversationBootstrap öğesindeki <bootstrap'ta> gerçekleşmesi gerekir.
<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>