2015-03-24 4 views
0

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

Вот моя конфигурация

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
     <binding maxReceivedMessageSize="104857600"> 
     <security> 
      <message clientCredentialType="Certificate" /> 
     </security> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <services> 
    <service name="AccountService" behaviorConfiguration=""> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IAccountService"></endpoint> 
    </service> 
    <service name="PortalService" behaviorConfiguration=""> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IPortalService"></endpoint> 
    </service> 
    </services> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     <serviceCredentials> 
      <clientCertificate> 
      <authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" /> 
      </clientCertificate> 
     </serviceCredentials> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

ответ

0

Вы используете NET 4 или 4.5?

Вещи, которые я думаю, что вы пропустили:

  • пользовательский basicHttpBinding необходимо использовать <security mode="Message"> (в настоящее время вы не уточняя его, что означает дефолт "None")
  • ваш обычай basicHttpBinding нуждается в name=, чтобы он мог на ссылку
  • вашим конечным точкам необходимо обратиться к таможне basicHttpBinding с помощью bindingConfiguration=
  • Ваш пользовательский сервис beha ВИОР нуждается в name= так можно ссылаться
  • ваша служба должна ссылаться на поведение пользовательских услуг с помощью behaviorConfiguration=
  • ваша служба должна указать <serviceCertificate> в <serviceCredentials>, который используется в протоколе, чтобы установить безопасный канал с клиентами
  • ваш клиент должен знать '<serviceCertificate>' в <clientCredentials> так, что он может установить безопасный канал с сервером
  • клиент должен прикрепить сертификат используется для удостоверения на запрос (ов), посылаемой на сервер (либо указав в нем <clientCertificate> в <clientCredentials> в .config, или программно)
  • убедитесь, что вы имеете ваши сертификаты созданы и установлены правильно

Примечание: вы должны быть созданы по крайней мере, 2 сертификата - 1, используемые для идентичности сервера - 1 или более, используемые клиентами для учетных данных (зависит, решите ли вы, что все клиенты должны предоставить один и тот же сертификат, или если вы назначаете уникальные для каждого из них) - НЕ используйте тот же сертификат для идентификации сервера и учетных данных клиента

Некоторые ссылки, чтобы помочь понять «безопасность на уровне сообщений»:

Рассмотрите возможность использования "Transport" уровень безопасности, если ваш обмен сообщениями является слишком медленным для вас.

Попробуйте это:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="securebasicHttpBinding" maxReceivedMessageSize="104857600"> 
      <security mode="Message"> 
      <message clientCredentialType="Certificate" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 

    <services> 
     <service behaviorConfiguration="secureBehaviour" name="AccountService"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding" 
      contract="IAccountService" /> 
     </service> 
     <service behaviorConfiguration="secureBehaviour" name="PortalService"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding" 
      contract="IPortalService" /> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="secureBehaviour"> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <serviceCredentials> 
      <serviceCertificate ...something goes here... /> 
      <clientCertificate> 
       <authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" /> 
      </clientCertificate> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
+0

Здравствуйте Колин, спасибо за ваш ответ, я попробовал, но без эффекта.Вы просто добавляете имя привязки и устанавливаете это имя для служб, не так ли? Или есть что-то, чего я пропустил? –

+0

Посмотрите, если это вам больше –

+0

Эй, Колин поблагодарил вас за добавление советов к вашему ответу, все, что вы упоминаете, правильно, и я могу просто добавить в этот список «добавить идентификатор к конечной точке (я думаю, что это требует базовыйHttpBinding)». Самая большая ошибка, которую я сделал, - это думать, что использовать услугу только для проверки сообщений от клиента до обслуживания, поэтому я пропустил . Очевидно, WCF не может проверять сообщение только в одном направлении. Но, что вы упомянули, прежде чем я пропустил имена в некоторых элементах, я думал, что .net будет использовать спецификацию по умолчанию без имени ... Во всяком случае, я думаю, что ваш ответ правильный и полезный. –

Смежные вопросы