В нижней части этой статьи ( 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);
}
}