2010-05-27 13 views
5

¿Hay alguna forma de extraer información sobre qué certificado de cliente se utilizó dentro de mi método de servicio web al usar <security mode="Transport>? Revisé OperationContext.Current pero no pude encontrar nada obvio.Información del certificado del Servicio WCF utilizando el modo de seguridad de transporte

Mi configuración del servidor es la siguiente:

<basicHttpBinding> 
    <binding name="SecuredBasicBindingCert"> 
     <security mode="Transport"> 
     <message clientCredentialType="Certificate" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 

estoy trabajando con un sistema de terceros pub/sub que es, por desgracia utilizando DataPower para la autenticación. Parece que si estoy usando WCF con esta configuración, no puedo obtener información sobre la persona que llama (ya que no se envían credenciales).

De alguna manera tengo que ser capaz de averiguar quién hace las llamadas a mi servicio sin cambiar mi configuración o pedirles que cambien su carga útil.

+0

Estoy considerando aprovechar la dirección del punto final simplemente agregando una cadena de consulta única a la misma. El QueryString se puede leer a través de '((System.ServiceModel.Channels.HttpRequestMessageProperty) System.ServiceModel.OperationContext.Current.IncomingMessageProperties [System.ServiceModel.Channels.HttpRequestMessageProperty.Name]). QueryString' – Langdon

Respuesta

5

Sí, pero no es intuitivo.

Primero, asegúrese y consulte el ensamblado System.IdentityModel de su biblioteca de servicios.

Ahora, agregue algo similar lo siguiente a su método de servicio donde le gustaría saber sobre el certificado de cliente:

// Find the certificate ClaimSet associated with the client 
foreach (ClaimSet claimSet in OperationContext.Current.ServiceSecurityContext.AuthorizationContext.ClaimSets) 
{ 
    X509CertificateClaimSet certificateClaimSet = claimSet as X509CertificateClaimSet; 
    if (certificateClaimSet != null) 
    { 
     // We found the ClaimSet, now extract the certificate 
     X509Certificate2 certificate = certificateClaimSet.X509Certificate; 

     // Do something interesting with information contained in the certificate 
     Debug.Print("Certificate Subject: " + certificate.Subject); 
    } 
} 

Espero que esto ayude!

+0

Gracias por la respuesta, pero' OperationContext .Current.ServiceSecurityContext.AuthorizationContext' está vacío! Tal vez IIS no proporciona el certificado a WCF? – Langdon

+0

O tal vez solo está disponible cuando ''? – Langdon

+0

No sé, nos funciona cuando usamos la seguridad del nivel de transporte con el enlace net.tcp en un escenario autoalimentado. No sé por qué el AuthorizationContext sería nulo en su caso. – luksan

Cuestiones relacionadas