Информация о сертификате из службы WCF с использованием режима безопасности транспорта - PullRequest
5 голосов
/ 27 мая 2010

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

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

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

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

Мне нужно каким-то образом выяснить, чьи звонки в мой сервис не меняются, и не просят их изменить свою полезную нагрузку.

1 Ответ

5 голосов
/ 03 июня 2010

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

Сначала убедитесь, что вы ссылаетесь на сборку 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);
    }
}

Надеюсь, это поможет!

...