2016-04-08 6 views
0

У меня есть веб-приложение, которое при необходимости вызывает метод WCF с олицетворением. В этом методе мне нужно вызвать другую веб-службу (ASMX), которая возвращает группы безопасности. Проблема заключается в том, что с настройкой олицетворения как обязательным я получаю сообщение об ошибке при попытке создать экземпляр службы ASMX.Ошибка олицетворения WCF Вызов ASMX

метод службы WCF

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public List<MacroTypeInfo> GetFilteredMacroDataTypes(MacroDataTypeSection section) 
{ 

    // Errors out here 
    using (var login = new local.intranet.webservices.login()) 
    { 
     login.getSecurityGroupsForUser(); // Never gets to this line 
    }  

} 

Ошибки я получаю

Either a required impersonation level was not provided, or the provided  
impersonation level is invalid. (Exception from HRESULT: 0x80070542) 

Есть ли что-то еще, что я должен сделать, чтобы быть в состоянии назвать это веб-сервис нутро это олицетворение нужный метод? Как только я удалю атрибут OperationBehavior, вызов будет работать.

+0

FWIW вы должны ** никогда * никогда не использовать олицетворение, для * любой * причины. –

+0

Не могли бы вы рассказать об этом? – user3726393

+0

Олицетворение - это буквально самое худшее решение для аутентификации и авторизации. Даже если вы хотите разрешить централизованное администрирование через сервер Active Directory, вы не должны использовать олицетворение, которое вы должны аутентифицировать и авторизуять на сервере AD как API –

ответ

1

Сервер не может олицетворять клиента удаленному серверу, если только не разрешено. Вы можете прочитать о разных уровнях олицетворения here

Если такое олицетворение требуется, клиент должен разрешить его явно с уровнем олицетворения Delegation.

Вы можете достичь этого в клиенте WCF с помощью следующей конечной конфигурации поведения:

<endpointBehaviors> 
    <behavior name="delegateIdentity"> 
     <clientCredentials> 
     <windows allowedImpersonationLevel="Delegation"/> 
     </clientCredentials> 
    </behavior> 
</endpointBehaviors> 

Если вы используете сгенерированный прокси вы можете установить это значение на прокси:

client.ChannelFactory.Credentials.Windows.AllowedImpersonationLevel = 
    System.Security.Principal.TokenImpersonationLevel.Delegation; 

Наконец, если вы создаете прокси с ChannelFactory<T>, вы можете просто установить то же значение, что и выше, на вас ChannelFactory<T>.

+0

Есть ли способ игнорировать олицетворение для этого вызова? – user3726393

+0

Если у вас есть контроль над сервисом входа в систему, вы можете изменить его, чтобы вызывающий абонент мог получать группы безопасности каждого пользователя. –

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

  • Нет связанных вопросов^_^