Como: definir a distorção máxima do relógio
As funções críticas de tempo poderão ser desencaminhadas se as configurações do relógio em dois computadores forem diferentes. Para mitigar essa possibilidade, você pode definir a propriedade MaxClockSkew
como um TimeSpan. Essa propriedade está disponível em duas classes:
Importante
Para uma conversa segura, as alterações na propriedade MaxClockSkew
devem ser feitas quando o serviço ou o cliente é inicializado. Para fazer isso, você deve definir a propriedade no SecurityBindingElement retornado pela propriedade SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement.
Para alterar a propriedade em uma das associações fornecidas pelo sistema, você deve encontrar o elemento de associação de segurança na coleção de associações e definir a propriedade MaxClockSkew
como um novo valor. Duas classes derivam de SecurityBindingElement: SymmetricSecurityBindingElement e AsymmetricSecurityBindingElement. Ao recuperar a associação de segurança da coleção, você deve converter em um desses tipos para definir corretamente a propriedade MaxClockSkew
. O exemplo a seguir usa o atributo WSHttpBinding, que utiliza o SymmetricSecurityBindingElement. Para obter uma lista que especifica qual tipo de associação de segurança usar em cada associação fornecida pelo sistema, consulte Associações fornecidas pelo sistema.
Para criar uma associação personalizada com um novo valor de distorção de relógio no código
Aviso
Adicione referências aos seguintes namespaces em seu código: System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissions e System.ServiceModel.Security.Tokens.
Crie uma instância de uma classe WSHttpBinding e defina seu modo de segurança como SecurityMode.Message.
Crie uma instância da classe BindingElementCollection chamando o método CreateBindingElements.
Use o método Find da classe BindingElementCollection para localizar o elemento de associação de segurança.
Ao usar o método Find, converta para o tipo real. O exemplo a seguir é convertido no tipo SymmetricSecurityBindingElement.
Defina a propriedade MaxClockSkew no elemento de associação de segurança.
Crie um ServiceHost com um tipo de serviço apropriado e um endereço base.
Use o método AddServiceEndpoint para adicionar um ponto de extremidade e incluir o 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
Para definir o MaxClockSkew na configuração
Crie um <customBinding> na seção do elemento <bindings>.
Crie um elemento <binding> e defina o atributo
name
a um valor apropriado. O exemplo a seguir o define comoMaxClockSkewBinding
.Adicione um elemento de codificação. O exemplo a seguir adiciona um <textMessageEncoding>.
Adicione um elemento <security> e defina o atributo
authenticationMode
para uma configuração apropriada. O exemplo a seguir define o atributo comoKerberos
para especificar que o serviço use a autenticação do Windows.Adicione um <localServiceSettings> e defina o atributo
maxClockSkew
como um valor na forma de"##:##:##"
. O exemplo a seguir o define para 7 minutos. Opcionalmente, adicione um <localServiceSettings> e defina o atributomaxClockSkew
para uma configuração apropriada.Adicione um elemento de transporte. O exemplo a seguir usa um <httpTransport>.
Para uma conversa segura, as configurações de segurança devem ocorrer no bootstrap no elemento <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>