2010-05-26 4 views
3

У меня есть 3 веб-службы, расположенные на одном сервере.Веб-службы WCF - олицетворение нескольких хопов на том же сервере

Мой клиент вызывает услугу A, которая олицетворяет клиента для вызова службы B, и все хорошо.

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

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

Спасибо!

ответ

0

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

0

Вы можете попробовать включения 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); 
    } 

} 
0

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

Смежные вопросы