WCF - изменение адреса конечной точки приводит к исключению безопасности - PullRequest
5 голосов
/ 29 октября 2008

Моя служба WCF использует wsHttpBinding и отлично работает на клиенте, когда служба формируется клиентом с использованием следующих параметров по умолчанию:

RServiceClient R = new RServiceClient();

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

RServiceClient R = new RServiceClient();
R.Endpoint.Address = new EndpointAddress(new Uri "http://xxx.xxxx.xxx:80/RServer/RService.svc"));

Однако, когда я указываю точную конечную точку, я получаю исключение SecurityNegotiationException: System.ServiceModel.Security.SecurityNegotiationException не было обработано Сообщение = "Звонящий не был аутентифицирован службой." Источник = "mscorlib" ....

Служба WCF работает на IIS и имеет анонимный доступ, включенный под администратором IIS. Кроме того, эта ошибка возникает, когда клиент запускается с той же машины, что и служба под учетной записью администратора - я еще не дошел до страшной части запуска его по сети!

Есть идеи?

Ответы [ 5 ]

8 голосов
/ 29 октября 2008

По умолчанию wsHttpBinding использует проверку подлинности Windows. Я не уверен, как хостинг в IIS влияет на этот сценарий.

Если вы не хотите, чтобы защита была включена, вы можете добавить элемент для безопасности и установить элемент режима «Нет» в конфигурации на обоих концах, чтобы отключить настройку по умолчанию.

Я думаю, что это может сработать - я добавил раздел для wsHttpBinding и установил привязкуConfiguration вашей службы, чтобы она указала на вновь добавленные свойства привязки:

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBind">
          <security mode="None">
            <transport clientCredentialType="None" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="None" algorithmSuite="Default" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
        <service behaviorConfiguration="ServiceBehavior" 
            name="RService">
            <endpoint address="" 
                binding="wsHttpBinding" 
                bindingConfiguration="wsHttpBind" 
                name="RService" 
                contract="IRService"> 
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" 
                binding="mexHttpBinding" 
                name="MetadataExchange" 
                contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
            <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>
3 голосов
/ 29 октября 2008

проверьте это из вашей конфигурации:

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

afaik wsHttpBinding имеет защиту сообщений по умолчанию . и когда он сверяется со значением DNS "localhost", он терпит неудачу.

0 голосов
/ 29 октября 2008

Удаление блока идентификации не сработало, хотя и дало мне идею: Если я изменю адрес конечной точки с:

        R.Endpoint.Address = new EndpointAddress(new Uri("http://bigpuss.homeip.net/RServer/RService.svc"));

до

        R.Endpoint.Address = new EndpointAddress(new Uri("http://localhost/RServer/RService.svc"));

тогда все отлично работает! Так, это явно расстроено из-за нелокального адреса URL. Существуют ли другие области конфигурации, в которых настроена безопасность?

0 голосов
/ 29 октября 2008

Вот моя информация о конфигурации сервиса, я использую wshttpbinding:

<system.serviceModel>
    <services>
  <service behaviorConfiguration="ServiceBehavior" name="RService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration=""
 name="RService" contract="IRService">
 <identity>
  <dns value="localhost" />
 </identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" name="MetadataExchange"
 contract="IMetadataExchange" />
   </service>
</services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>
0 голосов
/ 29 октября 2008

Используете ли вы MessageSecurity с сертификатами? это может быть проблема с сертификатом (неправильное имя хоста, самоподписанный сертификат не установлен и т. д.)

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