WCF получает доступ запрещен, когда потребитель пытается вызвать вызовы службы WCF, размещенные на виртуальной машине - PullRequest
3 голосов
/ 21 сентября 2010

Задача

System.ServiceModel.Security.SecurityAccessDeniedException : Access is denied.

Соответствующие строки стека (уменьшено)

Server stack trace: 
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)

Окружающая среда
Машина разработчика (хост): Windows Vista, Visual Studio 2008, nUnit
Тестовая машина (гость): Windows 2003, IIS, брандмауэр Windows 2003 (отключен)
Виртуальная машина: виртуальный ПК
Сеть: Microsoft Loopback Adapter

Описание
Windows 2003 содержит инвентаризацию службы WCF, службы в ней хорошо протестированы.
Когда потребитель приложения работает в Windows2003 - все работает нормально.
Когда потребитель приложения запускается из Windows Vista (в этой виртуальной сети) - возникают проблемы с безопасностью.Поэтому нужно было настроить сервис и включить сертификат.Документация была соблюдена, но в доступе по-прежнему отказано.

Цель
Никаких сложных мер безопасности не требуется - это просто ноутбук и виртуальная машина.Я попытался повторить этот официальный сценарий: http://msdn.microsoft.com/en-us/library/ms733938.aspx
Я хочу звонить службам, размещенным на Windows 2003, из моего приложения под ОС Windows Vista с помощью приложения Unit Test (nunit).Развернутые сервисы на Windows 2003 хорошо протестированы.

ЧТО РАБОТАЕТ
Любой сервис, использующий (или прошлые веб-сервисы .asmx), работает правильно.

Подозрение
Я полагаю, что это должно быть с этой проклятой Windows Vista.В журнале событий Windows 2003 имеются успешные записи аудита.

ПАРАМЕТРЫ ОБСЛУЖИВАНИЯ

Пользовательское приложение, работающее в Windows Vista:

<system.serviceModel>
<client>
  <endpoint address="http://soa.homolog.com/RemoteService/RemoteService.svc"
      binding="wsHttpBinding"
      behaviorConfiguration="InternetEndpointBehavior" 
      bindingConfiguration="AnonymousBindingConfiguration"
      contract="RemoteService.IRemoteService" 
      name="WSHttpBinding_IEmpresaService">
    <identity>
      <dns value="homologCertificate"  />
    </identity>
  </endpoint>
</client>
<bindings>
  <wsHttpBinding>
    <binding name="AnonymousBindingConfiguration">
      <security mode="Message">
        <message clientCredentialType="None" />            
      </security>
    </binding>
 </bindings>
 <behaviors>
 <endpointBehaviors>
    <behavior name="InternetEndpointBehavior">
      <clientCredentials>
        <serviceCertificate>
          <authentication certificateValidationMode="None" />
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
 </behaviors>
</system.serviceModel>

Служба, размещенная на IIS / Windows 2003:

<system.serviceModel>
<serviceHostingEnvironment>
  <baseAddressPrefixFilters>
    <add prefix="http://soa.homolog.com" />
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>
<bindings>

  <wsHttpBinding>
    <binding name="BindingNoSecurity">          
      <security mode="Message">
        <message clientCredentialType="None"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="CompanyCoreBehavior">

      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug 
              includeExceptionDetailInFaults="true" />
      <serviceThrottling 
              maxConcurrentCalls="500" 
              maxConcurrentInstances="500" 
              maxConcurrentSessions="500" />
      <serviceTimeouts 
              transactionTimeout="00:10:00" />

      <serviceCredentials>
        <serviceCertificate
                    findValue="homologCertificate"
                    storeLocation="LocalMachine"
                    x509FindType="FindBySubjectName"
                    storeName="My"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Ответы [ 2 ]

0 голосов
/ 01 октября 2010

Начните с , включив трассировку WCF на сервере.Журнал трассировки может содержать содержательное сообщение об ошибке.Включите протоколирование сообщений и посмотрите, есть ли очевидные различия между сообщениями, которые принимаются, и сообщениями, которые не принимаются.Хотя, если честно, я не понимаю, как это может произойти в вашем случае.

0 голосов
/ 21 сентября 2010

Это исключение System.ServiceModel.Security, поэтому, вероятно, это не проблема брандмауэра или IIS.

Попробуйте удалить следующий код из клиента:

  <clientCredentials> 
    <serviceCertificate> 
      <authentication certificateValidationMode="None" /> 
    </serviceCertificate> 
  </clientCredentials> 

И следующеекод с сервера:

  <serviceCredentials>  
    <serviceCertificate  
                findValue="homologCertificate"  
                storeLocation="LocalMachine"  
                x509FindType="FindBySubjectName"  
                storeName="My"/>  
  </serviceCredentials>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...