Олицетворение с помощью WCF - PullRequest
0 голосов
/ 21 июля 2010

Я пытаюсь представить через веб-службы 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"/>

1 Ответ

0 голосов
/ 29 июля 2010

Если вы используете безопасность транспортного уровня, то он будет использовать протокол https, а не http.

Вам нужно установить

<serviceMetadata httpsGetEnabled=true />

(в настоящее время у вас есть только httpGetEnabled).

...