2010-05-27 5 views
5

Есть ли способ извлечь информацию о том, какой сертификат клиента использовался в моем методе веб-службы при использовании <security mode="Transport>? Я просеял через OperationContext.Current, но не смог найти ничего очевидного.Информация сертификата из службы WCF с использованием режима безопасности транспорта

Моя конфигурация сервера выглядит следующим образом:

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

Я работаю с пабом сторонней системы/к югу, который, к сожалению, с помощью DataPower для аутентификации. Похоже, что если я использую WCF с этой конфигурацией, тогда я не могу получить информацию о вызывающем абоненте (поскольку на самом деле никаких учетных данных не отправлено).

Я как-то должен быть в состоянии выяснить, кто звонит на мою службу, не меняя конфигурацию, или прошу их изменить свою полезную нагрузку.

+0

Я рассматриваю возможность использования адреса конечной точки, просто добавив к нему уникальный запрос. QueryString можно прочитать через '((System.ServiceModel.Channels.HttpRequestMessageProperty) System.ServiceModel.OperationContext.Current.IncomingMessageProperties [System.ServiceModel.Channels.HttpRequestMessageProperty.Name]). QueryString' – Langdon

ответ

5

Да, но это неинтуитивно.

Во-первых, обязательно ознакомьтесь с сборкой System.IdentityModel из вашей сервисной библиотеки.

Теперь, добавить что-то подобное следующее вашего методу обслуживания, где вы хотели бы знать о сертификате клиента:

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

Надеется, что это помогает!

+0

Спасибо за ответ, но' OperationContext .Current.ServiceSecurityContext.AuthorizationContext' пуст! Может быть, IIS не предоставляет сертификат WCF? – Langdon

+0

Или, возможно, он доступен только в том случае, если ''? – Langdon

+0

Я не знаю, он работает для нас при использовании безопасности транспортного уровня с привязкой net.tcp в самообслуживании. Я не знаю, почему AuthorizationContext будет null в вашем случае. – luksan