Пользовательская проверка сертификата WCF - отправка клиенту сообщения об исключении - PullRequest
0 голосов
/ 13 октября 2011

У меня есть простая служба WCF, настроенная для защиты транспорта и учетных данных клиента сертификата. Я подключаю к нему настраиваемый валидатор сертификата и выдает FaultException. Мой пробкемн - это сообщение о том, что сообщение не доходит до клиента: я получаю только исключение MessageSecurityException без каких-либо ошибок ... Если я включаю свой сервис в net.tcp (самостоятельно), я получаю сообщение CommunicationExcetion, также без ошибок.

Вот часть моего web.config:

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpEndpointBinding" messageEncoding="Text">
          <reliableSession enabled="false" />
          <security mode="Transport">
            <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="SecureService.Server.ChunkStreamService">
        <endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" behaviorConfiguration="myBehavior" name="wsHttpEndPoint" contract="SecureService.Server.IChunkStreamService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="myBehavior">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <clientCertificate>
              <authentication  customCertificateValidatorType="SecureService.Server.CPSValidator, SecureService.Server" certificateValidationMode="Custom" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

и мой валидатор:

    public class CPSValidator : System.IdentityModel.Selectors.X509CertificateValidator
  {
    public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
    {
       throw new FaultException("Certificate is not from a trusted issuer");
    }
  }

Есть идеи?

Заранее спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 14 октября 2011

Как ответили Яхия и Пабло, проверка сертификата не происходит на уровне обслуживания.Поэтому FaultException не может связаться с клиентом.Но это верно только потому, что я использую режим безопасности транспорта.Чтобы отправить сообщение обратно клиенту, мне пришлось изменить свой режим безопасности с Transport на TransportWithMessageCredentials, например так:

<security mode="TransportWithMessageCredential">
  <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
  <message clientCredentialType="Certificate" negotiateServiceCredential="true" algorithmSuite="Default" />
</security>

Таким образом, проверка сертификата выполняется на уровне обслуживания, так что сообщение об ошибкеможет быть отправлено клиенту через faultException.

1 голос
/ 13 октября 2011

Насколько я знаю, любое исключение, которое вы добавляете в валидатор, никогда не достигает клиента.Клиент всегда получает MessageSecurityException.Только исключения, которые происходят на уровне сервиса (в реализации сервиса) и отображаются в FaultContract, правильно отправляются клиенту.

С уважением, Пабло.

0 голосов
/ 13 октября 2011

Вы пытались включить диагностику WCF на сервере для обнаружения проблем в конвейере WCF до того, как вызов поступил в саму службу?

<system.diagnostics>
<sources>
  <source name="System.ServiceModel" switchValue="Verbose" propagateActivity="true">
    <listeners>
      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="log.evtlog"  />
    </listeners>
  </source>
</sources>
<trace autoflush="true"/>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...