Олицетворение с использованием собственного хоста WCF WebServiceHost получает сообщение «Произошла ошибка операций». ошибка - PullRequest
0 голосов
/ 21 декабря 2011

Так что я бился головой об этом.У меня есть собственная служба WCF:

var webServiceHost = new WebServiceHost(helloWorld);
webServiceHost.Authorization.ImpersonateCallerForAllOperations = true;

var uri = new Uri(BaseUri + webService.UriDirectory);
var webHttpBinding = new WebHttpBinding(webHttpSecurityMode);
webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

var sep = webServiceHost.AddServiceEndpoint(IHelloWorld, webHttpBinding, uri);
var webHttpBehavior = new WebHttpBehavior {HelpEnabled = true};
sep.Behaviors.Add(webHttpBehavior);

webServiceHost.Open();

Я пошел дальше и применил к своему методу следующие атрибуты:

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public List<GpoItem> GetAll()
{
    using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
    {
        // Execute GPO code here...
        return new List<GpoItem>();
    }
}

Чтобы добавить немного контекста, я в основном имеювеб-сервис, который позволяет человеку войти на веб-страницу, создать объект групповой политики в домене.Запуск этого в консоли работает нормально, так как я запускаю его как зарегистрированный пользователь домена.Запуск его в качестве службы Windows вызывает исключение «Отказано в доступе».Таким образом, необходимость подражания.Я вставил следующий измененный код выше и получаю «Произошла ошибка операций.(Исключение из HRESULT: 0x80072020) '.Поиск в Google, который покажет мне проблему с разрешением.Я вхожу в среду тестирования веб-службы как администратор, поэтому у меня есть полный доступ, и я показал, что могу запускать его в консоли просто отлично, как администратор.Я чувствую, что мне не хватает какого-либо флага, задающего где-то.

Есть идеи?

[Update1] Я пытался переключить службу с работы в качестве локальной системы насетевой службы, но я все еще получаю ту же проблему.

[Update2] Когда я вхожу в систему на сервере, на котором размещена моя служба WCF (выполняется как локальная система), и использую браузер напрямуюна той машине все отлично работает.Кажется, проблема с делегированием аутентификации пользователей ... здесь пока неизвестно.

1 Ответ

0 голосов
/ 22 декабря 2011

Очевидно, можно получить токен уровня олицетворения только из атрибутов WCF, которые можно использовать только для доступа к локальным ресурсам. Вместо этого мне пришлось использовать LogonUser API, чтобы получить токен уровня делегата, который имеет доступ к сетевым ресурсам. [1]

[1] http://msdn.microsoft.com/en-us/library/ff649252.aspx

...