2014-09-26 2 views
2

Я преобразовываю некоторые существующие интеграционные тесты устаревшей службы WCF для автоматизации через NUnit. Текущие тесты вызывают развернутую версию службы WCF; то, что я хотел бы сделать, это проверить, что тесты попадают в класс обслуживания (MyService.svc.cs) напрямую/внутренне.Тестирование службы WCF, которая использует олицетворение

Проблема, которую я имею в том, что служба использует олицетворение:

//this is a method in MyService.svc.cs 
    public SomeObject GetSomeObject() 
    { 
     using (GetWindowsIdentity().Impersonate()) 
     { 
     //do some stuff 
     } 

     return null; 
    } 

    private WindowsIdentity GetWindowsIdentity() 
     { 
     var callerWinIdentity = ServiceSecurityContext.Current.WindowsIdentity; 

     var cf = new ChannelFactory<IMyService>(); 
     cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; 

     return callerWinIdentity; 
    } 

Проблема заключается в том, что ServiceSecurityContext.Current всегда нуль, когда я называю его из модульного тестирования.

Выдача олицетворения важна для последующих операций, поэтому я не могу просто обойти этот код и просто вызвать то, что находится в блоке using. Возможно, можно будет скомпоновать мой тестовый код в WindowsIdentity.GetCurrent().Impersonate() и , затем вызывать то, что находится в блоке using (минуя код MyService.svc.cs), но это было бы менее идеальным, поскольку это не было бы полным завершением -end test.

Мне не нужно подделывать разных пользователей для олицетворения - мне просто нужен контекст пользователя бегуна, который будет доступен в ServiceSecurityContext.Current.

Возможно ли это?

ответ

1

Мне все равно будет интересен лучший и менее инвазивный способ сделать это, но сейчас это работает.

Я создал второй конструктор для MyService, чтобы разрешить использование WindowsIdentity.GetCurrent().

private readonly bool _useLocalIdentity; 

    public MyService(bool useLocalIdentity) :this() 
    { 
     _useLocalIdentity = useLocalIdentity; 
    } 


    private WindowsIdentity GetWindowsIdentity() 
     { 
     if (_useLocalIdentity) 
     { 
      return WindowsIdentity.GetCurrent(); 
     } 

     var callerWinIdentity = ServiceSecurityContext.Current.WindowsIdentity; 
     if (callerWinIdentity == null) 
     { 
      throw new InvalidOperationException("Caller not authenticated"); 
     } 

     var cf = new ChannelFactory<IMyService>(); 
     cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; 

     return callerWinIdentity; 
    } 
Смежные вопросы