WCF-сервис SecurityNegotiationException - PullRequest
7 голосов
/ 27 января 2010

На моем сервере запущен простой сервис с WCF; служба размещена в WebDev.WebServer.exe (локально).

Когда я звоню в местную службу, я получаю следующее исключение:

Необработанное исключение: System.ServiceModel.Security.SecurityNegotiationException: Безопасный канал не может быть открыт, поскольку сбой согласования безопасности с удаленной конечной точкой. Это может быть связано с отсутствием или неправильным указанием EndpointIdentity в EndpointAddress, используемом для создания канала. Пожалуйста, убедитесь, что EndpointIdentity, указанный или подразумеваемый в EndpointAddress, правильно идентифицирует удаленную конечную точку. ---> System.ServiceModel.FaultException: сообщение с действием 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue' не может быть обработано в получателе из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть из-за либо несоответствие контракта (несоответствующие действия между отправителем и получателем), либо несоответствие привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют одинаковый контракт и одинаковую привязку (включая требования безопасности, например, Сообщение, Транспорт, Нет).

Вот мои два файла app.config от клиента и сервера. Я сделал app.config из клиента с помощью svcutil-Tool, поэтому он должен быть правильным:

Клиент

<client>
    <endpoint address="http://localhost:1634/UsuarioContexto.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IUsuarioContexto"

        contract="CarWin.ServiceContracts.Interfaces.IUsuarioContexto" name="LOCAL_WSHttpBinding_IUsuarioContexto">

        <identity><dns value="localhost" /></identity>

    </endpoint>

</client>

<binding name="WSHttpBinding_IUsuarioContexto" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">

    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />

    <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />

    <security mode="Message">

        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />

        <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" />

    </security>

</binding>

Сервер

<services>
    <service behaviorConfiguration="UsuarioContextoBehavior" name="UserContext.Host.UsuarioContexto">

        <endpoint address="" binding="wsHttpBinding" bindingNamespace="http://CarWin" bindingConfiguration="wsHttpBinding_IUsuarioContexto"

                  contract="CarWin.ServiceContracts.Interfaces.IUsuarioContexto">

            <identity>

                <dns value="localhost" />

            </identity>

        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

    </service>

</services>


<bindings>

    <wsHttpBinding>

        <binding name="wsHttpBinding_IUsuarioContexto" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">

            <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647" />

            <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />

            <security mode="None">

                <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />

                <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />

            </security>

        </binding>

    </wsHttpBinding>

</bindings>

<behaviors>

    <serviceBehaviors>

        <behavior name="UsuarioContextoBehavior">

            <serviceMetadata httpGetEnabled="true" />

            <serviceDebug includeExceptionDetailInFaults="true" />

        </behavior>

    </serviceBehaviors>

</behaviors>

Ответы [ 2 ]

12 голосов
/ 01 февраля 2010

Проблема была в сервере, я поставил mode = "Message" и работает хорошо. спасибо.

<security mode="None">  

<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />  

<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />  

</security> 
4 голосов
/ 28 января 2010

WCF очень мощный, но может быть кошмаром конфигурации. Вот несколько потенциальных клиентов:

  • Включите журналы трассировки WCF, перезапустите сценарий, а затем проверьте журналы с помощью SvcTraceViewer.exe
  • Выясните, насколько далеко зашло сообщение ...
    • т.е. формирует ли клиент запрос и отправляет ли его на сервер, который его отклоняет (т. е. на нижних уровнях WCF до того, как ваш собственный код службы будет обработан);
    • или запрос останавливается до этого .. клиент никогда даже не отправляет запрос
  • http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue - это сообщение, связанное с токеном WS-Trust, поэтому с аутентификацией будет что-то происходить
    • ошибка означает, что есть несоответствие конфигурации, но использование SvcUtil должно выстроить их в соответствие, как вы сказали
  • Привязка клиента имеет сервер на "http://localhost:1634/UsuarioContexto.svc"
    • Я не вижу этот порт, указанный в конфигурации службы ... служба прослушивает этот порт?
    • если вы откроете браузер и нацелите его на этот URL, вы получите страницу службы по умолчанию?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...