2010-05-27 7 views
5

Gibt es eine Möglichkeit zum Abrufen von Informationen darüber, welches Clientzertifikat in meiner Webdienstmethode bei Verwendung von <security mode="Transport> verwendet wurde? Ich habe durch OperationContext.Current gesichtet, konnte aber nichts Offensichtliches finden.Zertifikatsinformationen vom WCF-Dienst mithilfe des Transportsicherheitsmodus

Meine Serverkonfiguration ist wie folgt:

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

Ich arbeite mit einem Dritten Pub/Sub-System, die leider Data verwendet für die Authentifizierung. Wenn ich WCF mit dieser Konfiguration verwende, kann ich keine Informationen über den Anrufer erhalten (da keine Zugangsdaten tatsächlich gesendet werden).

Irgendwie muss ich herausfinden können, wessen Anrufe zu meinem Dienst gemacht werden, ohne meine Konfiguration zu ändern oder sie zu bitten, ihre Nutzlast zu ändern.

+0

Ich überlege, die Adresse des Endpunkts zu nutzen, indem ich einfach einen eindeutigen Querystring hinzufüge. Der QueryString kann über '(System.ServiceModel.Channels.HttpRequestMessageProperty) gelesen werden. System.ServiceModel.OperationContext.Current.IncomingMessageProperties [System.ServiceModel.Channels.HttpRequestMessageProperty.Name]). QueryString' – Langdon

Antwort

5

Ja, aber es ist nicht intuitiv.

Stellen Sie zuerst sicher, und verweisen Sie die System.IdentityModel-Assembly von Ihrer Servicebibliothek.

nun etwas Ähnliches wie folgt auf Ihre Service-Methode hinzufügen, in dem Sie über die Client-Zertifikat wissen möchten:

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

hoffe, das hilft!

+0

Danke für die Antwort, aber' OperationContext .Current.ServiceSecurityContext.AuthorizationContext' ist leer! Vielleicht stellt IIS WCF das Zertifikat nicht zur Verfügung? – Langdon

+0

Oder vielleicht ist es nur verfügbar, wenn ''? – Langdon

+0

Ich weiß nicht, es funktioniert für uns bei der Verwendung von Transport-Level-Sicherheit mit der Bindung net.tcp in einem selbst gehosteten Szenario. Ich weiß nicht, warum der AuthorizationContext in Ihrem Fall null wäre. – luksan