Procédure : définir une inclinaison de l’horloge maximale
Les fonctions à durée critique peuvent dérailler si les paramètres de l'horloge sont différents sur deux ordinateurs. Pour limiter cette possibilité, vous pouvez affecter à la propriété MaxClockSkew
un TimeSpan. Cette propriété est disponible sur deux classes :
Important
Pour une conversation sécurisée, les modifications de la propriété MaxClockSkew
doivent être effectuées lorsque le service ou le client est initialisé. Pour ce faire, vous devez affecter à la propriété la valeur de SecurityBindingElement retourné par SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement.
Pour modifier la propriété sur l'une des liaisons fournies par le système, vous devez rechercher l'élément de liaison de sécurité dans la collection de liaisons et affecter une nouvelle valeur à la propriété MaxClockSkew
. Deux classes dérivent de SecurityBindingElement : SymmetricSecurityBindingElement et AsymmetricSecurityBindingElement. Lorsque vous récupérez la liaison de sécurité de la collection, vous devez effectuer une conversion de type en l’un de ces types afin de définir correctement la propriété MaxClockSkew
. L'exemple suivant utilise un WSHttpBinding, qui utilise SymmetricSecurityBindingElement. Pour obtenir une liste qui spécifie quel type de liaison de sécurité utiliser dans chaque liaison fournie par le système, consultez Liaisons fournies par le système.
Pour créer une liaison personnalisée avec une nouvelle valeur d'inclinaison de l'horloge dans du code
Avertissement
Ajoutez des références aux espaces de noms suivants dans votre code : System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissions et System.ServiceModel.Security.Tokens.
Créez une instance d'une classe WSHttpBinding et choisissez le mode de sécurité SecurityMode.Message.
Créez une nouvelle instance de la classe BindingElementCollection en appelant la méthode CreateBindingElements.
Utilisez la méthode Find de la classe BindingElementCollection pour rechercher l’élément de liaison de sécurité.
Lorsque vous utilisez la méthode Find, effectuez une conversion de type au type réel. L'exemple suivant effectue une conversion de type au type SymmetricSecurityBindingElement.
Définissez la propriété MaxClockSkew sur l’élément de liaison de sécurité.
Créez un ServiceHost avec un type de service approprié et une adresse de base.
Utilisez la méthode AddServiceEndpoint pour ajouter un point de terminaison et inclure la 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
Pour définir MaxClockSkew dans la configuration
Créez un élément <customBinding> dans la section de l’élément <bindings>.
Créez un élément <binding> et affectez à l’attribut
name
une valeur adéquate. L'exemple suivant lui affecte la valeurMaxClockSkewBinding
.Ajoutez un élément d'encodage. L’exemple ci-dessous ajoute un élément <textMessageEncoding>.
Ajoutez un élément <security>, puis affectez à l’attribut
authenticationMode
une valeur appropriée. L'exemple suivant affecte à l'attribut la valeurKerberos
pour spécifier que le service utilise l'authentification Windows.Ajoutez un élément <localServiceSettings> et affectez à l’attribut
maxClockSkew
une valeur de la forme"##:##:##"
. L'exemple suivant lui attribue la valeur 7 minutes. Ajoutez éventuellement un élément <localServiceSettings> et affectez un paramètre approprié à l’attributmaxClockSkew
.Ajoutez un élément de transport. L’exemple ci-dessous utilise un élément <httpTransport>.
Pour une conversation sécurisée, les paramètres de sécurité doivent se produire à l’initialisation dans l’élément <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>