Веб-службы WCF - многократное олицетворение прыжков на одном сервере - PullRequest
3 голосов
/ 26 мая 2010

У меня есть 3 веб-сервиса, все они расположены на одном сервере.

Мой клиент вызывает Сервис A, который подражает клиенту, чтобы вызвать Сервис B, и все хорошо.

Теперь я хочу выдать себя за вызывающего абонента службы B (который является моим именем пользователя) для вызова службы C. Когда я использую ту же технику, что и раньше (AllowedImpersonationLevel = Impersonate, user.Impersonate ()), пользователь не будет передан к службе C. Вместо этого служба C видит пользователя как пользователя, под которым я запускаю его в IIS (который является UPN, а не стандартной учетной записью NETWORK SERVICE).

Что-нибудь особенное, что мне нужно сделать, чтобы это заработало? Это вопрос делегации? (Я думал, что это не будет делегирование, потому что они все на одном сервере)

Спасибо, ТАК!

Ответы [ 3 ]

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

Я бы ожидал использовать делегирование, поскольку вы дважды пересекаете границы процесса. Вы пробовали TokenImpersonationLevel.Delegation?

0 голосов
/ 26 ноября 2010

В этом сценарии требуется делегирование. Требуемая конфигурация - ImpersonationLevel.Delegation (устанавливается в конфигурации или коде). Взгляните на Руководство по безопасности WCF для codeplex, это очень хороший источник. Будьте внимательны, поскольку добиваетесь делегирования, особенно в производственной среде, требований больше, чем просто выбор правильной опции в файле конфигурации. Вы должны убедиться, что приложение, к которому вы подключаетесь, например, SQL-сервер настроен для делегирования и что определенные требования к инфраструктуре выполняются в активном каталоге и т. П., Например имена участников службы (SPN).

0 голосов
/ 04 июня 2010

Вы можете попробовать включить ASP.Net-совместимость в службе C

.

В Web.cofig

<system.web>
   <identity impersonate="true"/>
   <authentication mode="Windows"/>
</system.web>
<system.serviceModel>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

В вашем классе обслуживания

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service : IService
{
    public string ExecuteRequest(string xmlRequest)
    {
        IRequestManager requestManager = new RequestManager();
        return requestManager.ProcessRequest(xmlRequest);
    }

}
...