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

Я нахожусь в ситуации Catch-22 здесь? Моя цель - взять унаследованный мной сервис WCF, запустить его на виртуальной машине и проверить его, вызвав его с моего настольного ПК. ВМ находится в рабочей группе, а не в домене компании. По сути, нам нужно больше тестовых сред, в идеале по одной на разработчика (нам может понадобиться от 2 до 4 человек). Таким образом, идея виртуальной машины заключалась в том, что у каждого разработчика может быть свой собственный веб-сервер, который в некоторой степени соответствует реальной среде (где у нас фактически есть два веб-сайта: внешний / открытый и внутренний). [Использование VS2010 .NET 4.0]

Во внутренней службе каждый метод был отмечен этим атрибутом:

 [OperationBehavior(Impersonation = ImpersonationOption.Required)]

Я все еще исследую, почему это было необходимо. Я думаю, это потому, что веб-приложение вызывает «внутреннюю» службу, и либо а) нам нужны учетные данные пользователя, либо б) мы можем выполнить некоторые PrinciplePermission.Demands, чтобы увидеть, входит ли пользователь в группу. Меня интересует создание некоторых программ ConsoleTest или программ UnitTest.

Я изменил на разрешено так:

 [OperationBehavior(Impersonation = ImpersonationOption.Allowed)]

потому что я получаю эту ошибку при попытке просмотра .svc в браузере:

Операция контракта 'EditAccountFamily' требует идентификации Windows для автоматической олицетворения. Идентификатор Windows, представляющий вызывающего, не предоставляется привязкой ('WSHttpBinding', 'http://tempuri.org/') для контракта (' IAdminService ',' http://tempuri.org/'.

Я не получаю эту ошибку, если исходные привязки выглядят так:

Однако я считаю, что мне нужно отключить эту защиту, поскольку веб-служба не находится в домене.

Я склонен получать эти ошибки в клиенте:

1) Запрос токена безопасности не может быть выполнен, поскольку аутентификация не удалась - как InnerException «SecurityNegotiation было обработано».

или

2) Вызывающая сторона не была аутентифицирована службой как InnerException «SecurityNegotiation is unhandled».

Так могу ли я создать некоторую конфигурацию кода и web.config, которая позволит каждому разработчику работать на своей виртуальной машине? Или я должен присоединить виртуальную машину к домену?

Число перестановок кажется почти бесконечным. Я начал создавать Word.doc, который говорит, что делать с каждой ошибкой, но теперь я нахожусь в ловушке 22, где я застрял.

Спасибо

Нил


Привязки к серверу:

<bindings>
  <wsHttpBinding>
    <binding
      name="wsHttpEndpointBinding"
      maxBufferPoolSize="2147483647"
      maxReceivedMessageSize="500000000">
      <readerQuotas
        maxDepth="2147483647"
        maxStringContentLength="2147483647"
        maxArrayLength="2147483647"
        maxBytesPerRead="2147483647"
        maxNameTableCharCount="2147483647" />
      <!-- <security mode="None" />  This is one thing I tried --> 
      <security>
        <message
          clientCredentialType="Windows" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>


    <behavior
      name="ABC.AdminService.AdminServiceBehavior">
      <!-- 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" />
      <serviceCredentials>
      </serviceCredentials>
      <!--<serviceAuthorization principalPermissionMode="UseAspNetRoles" 
            roleProviderName="AspNetWindowsTokenRoleProvider"/>-->
      <serviceAuthorization
        principalPermissionMode="UseWindowsGroups"
        impersonateCallerForAllOperations="true" />
    </behavior>

  </serviceBehaviors>

</behaviors>


<serviceHostingEnvironment
  multipleSiteBindingsEnabled="true" />

КЛИЕНТ:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IAdminService" 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" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://192.168.159.132/EC_AdminService/AdminService.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IAdminService"
            contract="svcRef.IAdminService" name="WSHttpBinding_IAdminService">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Обновление от 12.12.2010: Даже этот простой метод получает ошибку SecurityNegotiation:

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public string TestHelloWorldOpen(string name)
{
    return "Hello1 " + name;
}

Ответы [ 2 ]

0 голосов
/ 29 декабря 2010

Вы задали в своем вопросе:

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

Я хочу сказать, что у вас будут проблемы, подобные этим, с каждым приложением, которое вы устанавливаете на той виртуальной машине, которая использует аутентификацию Windows, пока вы не поместите ее в домен. Я не вижу в этом особой проблемы WCF. Это проблема доверия учетных данных из ненадежного домена. Кроме того, я предполагаю, что ваша реальная среда находится в домене, поэтому для реального соответствия средам ваша виртуальная машина также должна быть в домене.

(ответ из комментария): Я просто предположил, что у вас может быть более одной заявки. Я могу ошибаться. Но у вас будет эта проблема, если вы используете проверку подлинности Windows с ASP.NET.

Наименее идеальная ситуация - иметь собственный код в ваших приложениях и сервисах, чтобы заставить их работать в специальной среде test / dev.

0 голосов
/ 23 декабря 2010

Попробуйте удалить элементы безопасности из привязок сервера и клиента.

Возможно, проблема связана с несоответствием между сервером и элементом безопасности клиента. Обычно, когда что-то идет не так с WCF, это происходит из-за ошибки в настройках привязки. Хорошая стратегия устранения неполадок состоит в том, чтобы удалить все ненужные элементы конфигурации, а затем попытаться добавить их один за другим - таким образом, изолируя проблему.

...