Я нахожусь в ситуации 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;
}