WCF Сервис Олицетворение - PullRequest
1 голос
/ 20 апреля 2010

Добрый день всем ...

Очевидно, я неправильно настраиваю олицетворение для своей службы WCF. Я НЕ хочу устанавливать безопасность для каждого метода отдельно (в фактическом коде позади). Услуга (на данный момент) открыта для вызова всеми в интрасети.

Так что мои вопросы ...

В: Какие теги веб-конфигурации мне не хватает?

В: Что мне нужно изменить в веб-конфигурации, чтобы олицетворение работало?

Сервис Web.config выглядит как ...

<configuration>
    <system.web>
        <authorization>
            <allow users="?"/>
        </authorization>
        <authentication mode="Windows"/>
        <identity impersonate="true" userName="MyDomain\MyUser" password="MyPassword"/>
    </system.web>
    <system.serviceModel>
        <services>
            <service behaviorConfiguration="wcfFISH.DataServiceBehavior" name="wcfFISH.DataService">
                    <endpoint address="" binding="wsHttpBinding" contract="wcfFISH.IFishData">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                </service>
            </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="wcfFISH.DataServiceBehavior">
                    <serviceMetadata httpGetEnabled="false"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

1 Ответ

5 голосов
/ 20 апреля 2010

Если вы всегда хотите выдать себя за клиента для всех операций, добавьте следующее к элементу <behavior>, то есть после элемента <serviceMetadata>:

<serviceAuthorization impersonateCallerForAllOperations="true" />

Если вы пытаетесь олицетворять на уровне приложения , то обычно вы не можете сделать это в WCF, поскольку WCF на самом деле не является частью конвейера ASP.NET.

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

Другой способ - включить режим совместимости ASP.NET, добавив его в <system.servicemodel>:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

Вы также иногда должны украсить свой сервис:

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

...