2010-05-27 16 views
5

Est-il possible d'extraire des informations sur le certificat client utilisé dans ma méthode de service Web lors de l'utilisation de <security mode="Transport>? J'ai passé au crible OperationContext.Current mais je n'ai rien trouvé d'évident.Informations de certificat du service WCF utilisant le mode de sécurité Transport

Ma configuration du serveur est la suivante:

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

Je travaille avec un tiers pub/sous-système qui utilise malheureusement DataPower pour l'authentification. Il semble que si j'utilise WCF avec cette configuration, je suis incapable de glaner des informations sur l'appelant (puisque aucune information d'identification n'est réellement envoyée).

Je dois d'une manière ou d'une autre être capable de savoir qui fait des appels à mon service sans changer ma configuration ou leur demander de changer leur charge utile.

+0

Je considère tirer parti de l'adresse du point de terminaison en lui ajoutant simplement une chaîne de requête unique. QueryString peut être lu via '(((System.ServiceModel.Channels.HttpRequestMessageProperty) System.ServiceModel.OperationContext.Current.IncomingMessageProperties [System.ServiceModel.Channels.HttpRequestMessageProperty.Name]). QueryString' – Langdon

Répondre

5

Oui, mais ce n'est pas intuitif. Tout d'abord, veillez à référencer l'assembly System.IdentityModel de votre bibliothèque de services.

Maintenant, ajoutez quelque chose de similaire qui suit à votre méthode de service où vous souhaitez savoir sur le certificat client:

// 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); 
    } 
} 

Hope this helps!

+0

Merci pour la réponse, mais' OperationContext .Current.ServiceSecurityContext.AuthorizationContext' est vide! Peut-être que IIS ne fournit pas le certificat à WCF? – Langdon

+0

Ou peut-être n'est-il disponible que si '? – Langdon

+0

Je ne sais pas, cela fonctionne pour nous lors de l'utilisation de la sécurité au niveau du transport avec la liaison net.tcp dans un scénario auto-hébergé. Je ne sais pas pourquoi le AuthorizationContext serait null dans votre cas. – luksan