Mi problema particular es algo como esto:personalizado de validación de certificados de cliente y nombre de usuario en el servicio de WCF
Estamos actualmente en ejecución un conjunto de servicios que requiere los clientes para proporcionar un nombre de usuario y contraseña como la autenticación cuando se llama al servicios.
Nos gustaría implementar una infraestructura PKI en estos servicios, pero algunos de nuestros socios utilizarán más tiempo para acomodarse a esta nueva infraestructura que los demás.
Como primer paso, queremos solicitar certificados de cliente de algunos de nuestros socios. Se requerirá un certificado de cliente (además del nombre de usuario y la contraseña) para acceder a sus datos en nuestros servidores, mientras que para los demás usuarios solo se requerirán nombre de usuario y contraseña.
Para resolver este problema que estoy tratando de implementar un validador personalizado tanto para la autenticación de nombre de usuario/contraseña (usando UserNamePasswordValidator) y para los certificados de cliente (utilizando X509CertificateValidator) en WCF. El validador de nombre de usuario/contraseña verificará estas credenciales hacia nuestra base de datos, mientras que el validador de certificados del cliente inspeccionará si la solicitud es de un cliente del cual se requiere un certificado y, de ser así, verificará si se proporciona un certificado de cliente válido. No he podido configurar WCF para que use estos dos validadores.
Mi configuración de WCF en el servidor está configurado actualmente como esto:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpsGetEnabled="true" policyVersion="Policy15" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication customCertificateValidatorType="MyWS.Security.MyServicesCertificateValidator, MyWS"
certificateValidationMode="Custom" revocationMode="NoCheck" />
</clientCertificate>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MyWS.Security.MyServicesUsernameValidator, MyWS" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
<bindings>
<basicHttpBinding>
<binding name="MySoapBinding">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Certificate" />
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyWS.Services.TheService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="MySoapBinding" name="TheService" bindingNamespace="https://services.my/TheService" contract="MyWS.Interfaces.Service.ITheService" />
<host>
<baseAddresses>
<add baseAddress="https://localhost:4434/MyWS/TheService"/>
</baseAddresses>
</host>
</service>
</services>
Por lo que yo entiendo que esta configuración no es válida porque no puedo utilizar el customCertificateValidatorType en la capa de transporte (porque IIS inspecciona el certificado antes de que WCF esté involucrado aquí), pero no veo cómo puedo combinar los tipos customCertificateValidatorType y customUserNamePasswordValidatorType como tipos de credenciales en la capa de mensajes.
Implementé un inspector de mensajes y podría resolver el problema usando OperationContext de alguna manera (como se sugiere en el siguiente enlace), pero no he podido ver la forma de hacerlo de esta manera sin embargo ...
http://social.msdn.microsoft.com/Forums/en/wcf/thread/b6ab8b58-516b-41d4-bb0e-75b4baf92716
supongo que podría estar tratando de poner en práctica algo que es incompatible con la forma en que funciona WCF, pero si alguien tiene una idea acerca de cómo esto podría ser fijado estaría encantada de tener su comentarios sobre esto!
Gracias por su comentario. Me guió en la dirección correcta, utilizando múltiples puntos finales y tokens de apoyo en un enlace personalizado. – Hanskun