2010-09-24 17 views
8

Necesito proporcionar un servicio a un tercero que enviará mensajes soap con una marca de tiempo firmada.WCF Service with WS-Security requiere Signed Timestamp only

¿Cómo puedo configurar mi servicio para admitir esto?

ACTUALIZACIÓN He conseguido acercarse al formato del mensaje SOAP que estamos buscando, pero WCF insiste en firmar tanto el nombre de usuario y las fichas de sello de tiempo, ¿Hay una manera de modificar la unión a solo firme la marca de tiempo?


nueva actualización Éstos son nuestros requisitos:

  • El elemento Marca de tiempo debe ser firmado.
  • El nombre CN en el certificado utilizado para la firma DEBE coincidir con el nombre de usuario otorgado en el elemento UsernameToken.
  • El certificado utilizado para la firma DEBE enviarse en el elemento BinarySecurityToken.
  • El elemento KeyInfo DEBE contener solo un elemento SecurityTokenReference, que se debe usar para hacer referencia al BinarySecurityToken.
  • Se DEBE especificar un algoritmo de canonicalización.
  • El SignatureMethod DEBE especificarse y DEBE ser el alghorithm SHA-1 o SHA-2.
  • Las firmas separadas DEBERÍAN ser utilizadas.

¿Alguna sugerencia?

de configuración actual

cliente Encuadernación

<bindings> 
    <wsHttpBinding> 
    <binding name="WSBC"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Certificate" proxyCredentialType="None"></transport> 
     <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

cliente de Endpoint

<client> 
    <endpoint address="https://localhost/WcfTestService/Service2.svc" 
    behaviorConfiguration="CCB" binding="wsHttpBinding" 
    bindingConfiguration="WSBC" 
    contract="ServiceReference2.IService2" 
    name="wsHttpBinding_IService2" /> 
</client> 

comportamiento de los clientes

<behaviors> 
    <endpointBehaviors> 
    <behavior name="MBB"> 
     <clientCredentials> 
     <clientCertificate findValue="03 58 d3 bf 4b e7 67 2e 57 05 47 dc e6 3b 52 7f f8 66 d5 2a" 
          storeLocation="LocalMachine" 
          storeName="My" 
          x509FindType="FindByThumbprint" /> 
     <serviceCertificate> 
      <defaultCertificate findValue="03 58 d3 bf 4b e7 67 2e 57 05 47 dc e6 3b 52 7f f8 66 d5 2a" 
           storeLocation="LocalMachine" 
           storeName="My" 
           x509FindType="FindByThumbprint" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

Encuadernación

<bindings> 
    <wsHttpBinding> 
    <binding name="ICB"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Certificate" proxyCredentialType="None"></transport> 
     <message clientCredentialType="UserName" 
        negotiateServiceCredential="false" 
        establishSecurityContext="false" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Serice extremo de servicio

<service name="WcfTestService.Service2" behaviorConfiguration="SCB"> 
    <endpoint  address="" binding="wsHttpBinding" contract="WcfTestService.IService2" 
    bindingConfiguration="ICB" name="MS" /> 
</service> 

Comportamiento Servicio

<behaviors> 
    <serviceBehaviors> 
    <behavior name="SCB"> 
     <serviceCredentials> 
     <serviceCertificate  findValue="4d a9 d8 f2 fb 4e 74 bd a7 36 d7 20 a8 51 e2 e6 ea 7d 30 08" 
           storeLocation="LocalMachine" 
           storeName="TrustedPeople" 
           x509FindType="FindByThumbprint" /> 
     <userNameAuthentication 
      userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="WcfTestService.UsernameValidator, WcfTestService" /> 
     <clientCertificate> 
      <authentication certificateValidationMode="None" revocationMode="NoCheck" /> 
     </clientCertificate> 
     </serviceCredentials> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
+1

¿Logró que la configuración funcionara para que solo se firmara el elemento Timestamp? Actualmente estoy tratando de lograr lo mismo. – Edward

Respuesta

3

Es posible que desee considerar una clase de unión de seguridad personalizada que implementa la seguridad de la manera que desea, en lugar que el valor predeterminado de WCF.

Estos enlaces MSDN explica enlaces personalizados y la clase base abstracta SecurityBindingElement:

http://msdn.microsoft.com/en-us/library/ms730305.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.securitybindingelement.aspx

+0

¡No fui yo! ¡He estado tirando de mi cabello tyring para obtener un enlace personalizado para producir los resultados correctos! Debería actualizar la pregunta, ya que ahora básicamente lo que quiero es basicHttpBinding (Soap 1.1) con modo de seguridad = TransportWithMessageCredential con ambos certificados para mensajes y transporte ... ¡Pero también tenemos que enviar/recibir UsernameToken también! –

+0

Gracias por el comentario @Dog Ears, ¿cree que vale la pena crear una nueva pregunta con su solicitud más específica? –

0

Usted puede hacer esto con los contratos de mensajes, ver: http://msdn.microsoft.com/en-us/library/ms730255.aspx

Aquí es un ejemplo desde el enlace de arriba:

[MessageContract] 
public class PatientRecord 
{ 
    [MessageHeader(ProtectionLevel=None)] public int recordID; 
    [MessageHeader(ProtectionLevel=Sign)] public string patientName; 
    [MessageHeader(ProtectionLevel=EncryptAndSign)] public string SSN; 
    [MessageBodyMember(ProtectionLevel=None)] public string comments; 
    [MessageBodyMember(ProtectionLevel=Sign)] public string diagnosis; 
    [MessageBodyMember(ProtectionLevel=EncryptAndSign)] public string medicalHistory; 
} 

Tenga en cuenta los niveles de protección Ninguno, signo, cifrado y firma

+0

No creo que esto funcione, básicamente estoy tratando de agregar un wsse: UserNameToken, pero usar este enfoque no funciona, ya que el framework reconoce el token y arroja un error, ya que no se espera que forme parte del enlace. –

1

WCF no permite de forma nativa firmar la marca de tiempo pero no el nombre de usuario. Primero, estoy bastante seguro de que esto no está relacionado con el problema al que se enfrenta: un servidor debería ser capaz de manejar ambos casos. Si lo necesita, le sugiero que no use ningún nombre de usuario en la seguridad (por ejemplo, modo de seguridad de "anonymousForCertificate") y luego implemente un codificador de mensajes personalizado para insertar manualmente las etiquetas de nombre de usuario/contraseña en el encabezado en el lugar correcto (tomar cuidado de no cambiar ninguna parte firmada en el mensaje, principalmente la marca de tiempo).

+0

Es una vieja pregunta que solo quería resolver, el requisito original era solo el nombre de usuario, sin una contraseña (el nombre de usuario era para mantener el nombre común del certificado SSL). Nos estaban dictando, teníamos que implementar el servidor y el cliente que se conectarían a un sistema de terceros del que no teníamos control (Java). Daré un giro al codificador, cualquier enlace a información sobre codificación personalizada sería útil. Saludos cordiales. –

+0

http://msdn.microsoft.com/en-us/library/ms751486.aspx –