Передайте ClientCredentials.UserName на сервер - PullRequest
0 голосов
/ 30 июня 2011

Веб-конфигурация:

<?xml version="1.0"?>
  <configuration>
<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceCredentialsBehavior">
                <serviceCredentials>
                    <serviceCertificate findValue="cool"    storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
                </serviceCredentials>
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="ServiceCredentialsBehavior" name="Service">
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MessageAndUserName" name="SecuredByTransportEndpoint" contract="IService"/>
        </service>
    </services>
    <bindings>
        <wsHttpBinding>
            <binding name="MessageAndUserName">
                <security mode="Message">
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client/>
</system.serviceModel>
<system.web>
    <compilation debug="true"/>
</system.web>

Клиент cfg:

<?xml version="1.0" encoding="utf-8"?>
 <configuration>
<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IService" >
                <security mode="Message">
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:48097/WCFServer/Service.svc"
                  binding="wsHttpBinding"
                  bindingConfiguration="WSHttpBinding_IService"
                  contract="ServiceReference1.IService"
                  name="WSHttpBinding_IService">
            <identity>
                <dns value ="cool" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Задача - передать ClientCredentials.UserName.UserName / Password через безопасное соединение. Я сделал x509 сертификаты с самоотверженным сертификатом.

Ошибка:

Согласование безопасности SOAP с 'http://localhost:48097/WCFServer/Service.svc' для цели «http://localhost:48097/WCFServer/Service.svc' не удалось. Смотрите внутреннее исключение для более подробности.

InnerException:

Сертификат X.509 CN = крутая цепь Здание не удалось. Сертификат, который был использован имеет цепочку доверия, которая не может быть проверенным. Заменить сертификат или изменить certificateValidationMode. Цепочка сертификатов обработана, но завершается корневым сертификатом, который не является доверенным поставщиком доверия.

Как я могу решить это исключение? С уважением,
Серджиу.

1 Ответ

4 голосов
/ 30 июня 2011

Вы используете самозаверяющий сертификат, который по умолчанию не является доверенным. Вы должны сообщить клиентскому приложению, что оно должно доверять сертификату:

<behaviors>
  <endpointBehaviors>
    <behavior name="LocalCertValidation">
      <clientCredentials>
        <serviceCertificate>
          <authentication certificateValidationMode="PeerTrust" />
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

Ссылайтесь на это поведение из конфигурации вашей конечной точки в клиенте по behaviorConfiguration="LocalCertValidation". Чтобы это работало, вы должны установить публичный сертификат в хранилище сертификатов текущего пользователя под доверенными лицами. Вы также можете установить режим проверки на None, и сертификат вообще не будет проверяться, но его следует использовать только в среде разработки.

...