Информация о сертификате из службы WCF с использованием режима безопасности транспорта

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

Конфигурация моего сервера следующая:

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

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

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


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


Ответы (1)


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

Во-первых, обязательно укажите сборку 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);
    }
}

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

person luksan    schedule 03.06.2010
comment
Спасибо за ответ, но OperationContext.Current.ServiceSecurityContext.AuthorizationContext пусто! Может быть, IIS не предоставляет сертификат WCF? - person Langdon; 04.06.2010
comment
Или, может быть, это доступно только когда <security mode="TransportWithMessageCredential"/>? - person Langdon; 04.06.2010
comment
Я не знаю, у нас это работает при использовании безопасности на транспортном уровне с привязкой net.tcp в локальном сценарии. Я не знаю, почему в вашем случае AuthorizationContext будет нулевым. - person luksan; 07.06.2010