Instrukcje: ustawianie maksymalnego przesunięcia czasowego zegara
Funkcje krytyczne dla czasu można wykoleić, jeśli ustawienia zegara na dwóch komputerach są różne. Aby wyeliminować tę możliwość, możesz ustawić MaxClockSkew
właściwość na TimeSpanwartość . Ta właściwość jest dostępna w dwóch klasach:
Ważne
W przypadku bezpiecznej konwersacji należy wprowadzić zmiany MaxClockSkew
we właściwości podczas uruchamiania usługi lub klienta. W tym celu należy ustawić właściwość zwróconą SecurityBindingElementSecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement przez właściwość .
Aby zmienić właściwość na jednym z powiązań dostarczonych przez system, należy znaleźć element powiązania zabezpieczeń w kolekcji powiązań i ustawić MaxClockSkew
właściwość na nową wartość. Dwie klasy pochodzą z klasy SecurityBindingElement: SymmetricSecurityBindingElement i AsymmetricSecurityBindingElement. Podczas pobierania powiązania zabezpieczeń z kolekcji należy rzutować na jeden z tych typów, aby poprawnie ustawić MaxClockSkew
właściwość. W poniższym przykładzie użyto elementu WSHttpBinding, który używa elementu SymmetricSecurityBindingElement. Aby uzyskać listę określającą typ powiązania zabezpieczeń do użycia w każdym powiązaniu dostarczonym przez system, zobacz Powiązania dostarczone przez system.
Aby utworzyć niestandardowe powiązanie z nową wartością niesymetryczności zegara w kodzie
Ostrzeżenie
Dodaj odwołania do następujących przestrzeni nazw w kodzie: System.ServiceModel.Channels, , System.ServiceModel.DescriptionSystem.Security.Permissionsi System.ServiceModel.Security.Tokens.
Utwórz wystąpienie WSHttpBinding klasy i ustaw jego tryb zabezpieczeń na SecurityMode.Message.
Utwórz nowe wystąpienie BindingElementCollection klasy, wywołując metodę CreateBindingElements .
Find Użyj metody BindingElementCollection klasy, aby znaleźć element powiązania zabezpieczeń.
W przypadku używania Find metody rzutowanie do rzeczywistego typu. Poniższy przykład rzutuje na SymmetricSecurityBindingElement typ.
MaxClockSkew Ustaw właściwość elementu powiązania zabezpieczeń.
Utwórz element z odpowiednim typem ServiceHost usługi i adresem podstawowym.
AddServiceEndpoint Użyj metody , aby dodać punkt końcowy i dołączyć element 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
Aby ustawić wartość MaxClockSkew w konfiguracji
Utwórz element customBinding> w< sekcji elementu bindings>.<
<Utwórz element powiązania> i ustaw
name
atrybut na odpowiednią wartość. Poniższy przykład ustawia go naMaxClockSkewBinding
wartość .Dodaj element kodowania. Poniższy przykład dodaje tekstMessageEncoding>.<
<Dodaj element zabezpieczeń> i ustaw
authenticationMode
atrybut na odpowiednie ustawienie. W poniższym przykładzie ustawiono atrybut , abyKerberos
określić, że usługa korzysta z uwierzytelniania systemu Windows.Dodaj wartość <localService Ustawienia> i ustaw
maxClockSkew
atrybut na wartość w postaci"##:##:##"
. Poniższy przykład ustawia go na 7 minut. Opcjonalnie dodaj wartość <localService Ustawienia> i ustawmaxClockSkew
atrybut na odpowiednie ustawienie.Dodaj element transportu. W poniższym przykładzie użyto protokołu httpTransport>.<
W przypadku bezpiecznej konwersacji ustawienia zabezpieczeń muszą występować podczas uruchamiania w elemecie 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>