Попытка следовать примеру делегирования WCF на MSDN, но продолжаю получать исключение "уровня олицетворения" - PullRequest
0 голосов
/ 04 августа 2010

В нижней части этой статьи ( MSDN ) в разделе, озаглавленном «Следующий пример кода демонстрирует, как использовать делегирование».где MSDN показывает пример того, как выполнить делегирование.Я попытался взять этот пример и применить его к моему коду.В моей ситуации у меня есть клиентское приложение (WCFTestClient), промежуточный сервис и бэкэнд-сервис.Цель состоит в том, чтобы клиент выполнил открытый метод WCF в промежуточной службе, которая, в свою очередь, вызывает другой метод во внутренней службе.Я пытаюсь получить идентичность выполнения как на промежуточном, так и на внутреннем сервисе, чтобы идентифицировать пользователя, выполняющего клиент:

Клиент ----> Средний сервис ----> БэкэндСлужба.

Вот исключение, которое возникает при вызове «channel.PreparePolicy»:

Не удалось загрузить файл или сборку 'System.Transactions, Version = 2.0.0.0, Culture= нейтральный, PublicKeyToken = b77a5c561934e089 'или одна из его зависимостей.Либо требуемый уровень олицетворения не был предоставлен, либо предоставленный уровень олицетворения недействителен.(Исключение из HRESULT: 0x80070542)

Вот мой код, взятый наиболее непосредственно из примера.Я добавил одну строку, которая отличается от примера MSDN моей попыткой отладки channelFactory.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;
, но безрезультатно.

    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public void PreparePolicy(string requestGuid, string policyName, ulong version)
    {
        WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
             ("The caller cannot be mapped to a Windows identity.");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            NetTcpBinding binding = new NetTcpBinding();
            binding.Security.Mode = SecurityMode.Message;
            Uri uri = new Uri(String.Format("net.tcp://{0}:{1}/App", "10.192.12.159", 8080));
            EndpointAddress backendServiceAddress = new EndpointAddress(uri);
            ChannelFactory<Service> channelFactory = new ChannelFactory<Service>(binding, backendServiceAddress);
            channelFactory.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;
            Service channel = channelFactory.CreateChannel();
            channel.PreparePolicy("alkdjf", policyName, version);

        }
 }

1 Ответ

0 голосов
/ 06 августа 2010

Я использовал WCFTestClient в качестве моего клиента в этом сценарии.Оказывается, не разрешено делегирование.Я написал свой собственный клиент и включил его для делегирования, и все работало нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...