Я пытаюсь представить через веб-службы WCF функции, которые обращаются к SQL-серверу (через Entity Framework) с использованием учетных данных пользователя (это требование клиента / dba из-за триггеров аудита и т. Д. учетные данные пользователя)
У меня проблемы с получением WCF для реализации подражания. (на самом деле это был кошмар). Я добавил
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
атрибут моего контракта. Но затем он пожаловался на то, что BasicHttpContract не может выполнять олицетворение окон. Я пытался изменить его на wsHttpBinding. Теперь обмен метаданными нарушен. Пока я только пытаюсь открыть сервисы в Internet Explorer, еще даже не начал подключаться к нему с клиентом. Соответствующий раздел файла web.config выглядит ниже
<behaviors>
<serviceBehaviors>
<behavior name="AssetManagerBehavior">
<serviceAuthorization impersonateCallerForAllOperations="true" />
<!--
-->
<!-- 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>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service name="AssetManager.ServiceInterface" behaviorConfiguration="AssetManagerBehavior">
<endpoint address="" binding="wsHttpBinding" contract="IAssetServices">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="test">
<security mode="TransportWithMessageCredential" />
</binding>
</wsHttpBinding>
</bindings>
Соответствующий класс интерфейса службы выглядит так
namespace AssetManager.ServiceInterface
{
[ServiceContract]
public interface IAssetServices
{
[OperationContract]
EmployeeDTO CreateNewEmployee(string firstName, string lastName);
}
}
Реальная реализация выглядит следующим образом
namespace AssetManager.ServiceInterface
{
public class AssetManagerServices : IAssetServices
{
#region IAssetServices Members
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public EmployeeDTO CreateNewEmployee(string firstName, string lastName)
{
}
}
}
Я использую VS 2010, .net 4, IIS 7 (с включенными следующими аутентификациями - Аноним, олицетворение ASP.NET, Базовая аутентификация, Дайджест-аутентификация и Аутентификация Windows). На корневом веб-сервере в IIS я щелкнул Ограничения ISAPI и CGI и разрешил доступ ко всем расширениям (вероятно, asp.net 4.0 будет относительным)
Мое текущее препятствие заключается в том, что в браузере IE указано, что «публикация метаданных для этой службы отключена» Это также не позволяет мне добавлять сервисные ссылки.
В качестве последнего замечания, конечно, подражание Windows не должно быть таким сложным. Каков предлагаемый способ олицетворения для веб-сервисов с использованием WCF? В мире asp.net это было так просто, как добавление <authentication mode="Windows"/>
и <identity impersonate="true"/>