HTTP-запрос запрещен со схемой аутентификации клиента «Анонимный».

Это кажется распространенной проблемой, и я просмотрел все ответы здесь, но ни один из них не помог.

Я пытаюсь заставить SSL работать с базовой httpbinding и службой WCF, размещенной на iis. Думаю проблема в iis или с сертификатами. Я создал самоподписанный сертификат в диспетчере iis. Мой сертификат называется «mycomputer», и он также был помещен в список Trusted Root Certification. У клиента нет проблем с поиском сертификата.

Мои настройки в iis включают анонимную аутентификацию и отключают все остальное. Также требуется SSL и принимается сертификат клиента. Это правильно? Я получаю сообщение об ошибке, если я выбираю игнорировать.

Я не вижу ничего плохого в своих конфигах, они правильные?

Конфиг службы:

<system.serviceModel>
<services> 
  <service behaviorConfiguration="MyBehaviour" name="BasicHttpSecTest.Service1"> 
    <endpoint name="MyEndPoint" address="https://mycomputer/wp/" binding="basicHttpBinding" bindingConfiguration="ClientCertificateTransportSecurity" contract="BasicHttpSecTest.IService1" /> 
    <!--<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />-->
  </service> 
</services> 
<behaviors> 
  <serviceBehaviors> 
    <behavior name="MyBehaviour"> 
      <serviceMetadata httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceCredentials>
        <clientCertificate>
          <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
        </clientCertificate>
      </serviceCredentials>
    </behavior> 
  </serviceBehaviors> 
</behaviors> 
<bindings> 
  <basicHttpBinding> 
    <binding name="ClientCertificateTransportSecurity"> 
      <security mode="Transport"> 
        <transport clientCredentialType="Certificate" />
      </security> 
    </binding> 
  </basicHttpBinding> 
</bindings>
</system.serviceModel> 

Конфигурация клиента:

<system.serviceModel> 
<client>
    <endpoint address="https://mycomputer/wp/Service1.svc" binding="basicHttpBinding"
        bindingConfiguration="MyEndPoint" contract="ServiceSSLref.IService1"
        name="MyEndPoint1" behaviorConfiguration="ClientCertificateCredential"/>
</client>

<bindings>
    <basicHttpBinding>
        <binding name="MyEndPoint">
            <security mode="Transport">
                <transport clientCredentialType="Certificate" />
            </security>
        </binding>
    </basicHttpBinding>
</bindings>

<behaviors> 
  <endpointBehaviors> 
    <behavior name="ClientCertificateCredential"> 
      <clientCredentials> 
        <clientCertificate findValue="mycomputer" storeLocation="LocalMachine" storeName="My" x509FindType="FindByIssuerName" />
        <serviceCertificate>
          <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
        </serviceCertificate>
      </clientCredentials> 
    </behavior> 
  </endpointBehaviors> 
</behaviors>
</system.serviceModel>

person Zeezer    schedule 13.02.2013    source источник


Ответы (1)


Я предполагаю, что ваша проблема может быть в вашем клиентском сертификате. Установив clientCredentialType="Certificate", вы сообщаете WCF, что клиент должен указать сертификат, которому доверяет сервер. Насколько я понял, у вас есть только сертификат, сгенерированный на стороне сервера. Попробуйте установить

 <transport clientCredentialType="None" /> 

Это позволит вам отправлять сообщения, не требуя сертификата, которому доверяет сервер. Или вы можете попробовать сгенерировать сертификат на стороне клиента и поместить его в папку Trusted на вашем сервере. Возможно, это состояние поможет вам http://msdn.microsoft.com/en-us/library/ms731074.aspx

person Alex    schedule 13.02.2013
comment
Спасибо, я думаю, что это могло быть решением этой ошибки. Однако я получаю Удаленный сервер вернул неожиданный ответ: (405) Метод не разрешен. на том же этапе, так что я не уверен, лучше это или хуже - person Zeezer; 13.02.2013
comment
Посмотрите, есть ли у вас ключевое слово public в интерфейсе контракта. И не забудьте C:\Windows\Microsoft.NET\Framework\v4.0.30319›ServiceModelReg.exe -i - person Alex; 13.02.2013
comment
Большое спасибо! Сидел на днях с этой проблемой. Теперь все работает, а последнюю проблему легко решить. Мой адрес должен быть mycomputer/wp/Service1.svc, а не мойкомпьютер/wp. - person Zeezer; 13.02.2013