Олицетворение в службе WCF и распространение на COM-объект - PullRequest
0 голосов
/ 07 сентября 2010

Я пытаюсь создать службу WCF для предоставления некоторых служб. В одном из контрактов я должен выдать себя за другого пользователя и вызвать COM-объект. Я знаю, что если я хочу распространить олицетворение в COM-объект, я должен вызвать CoInitializaSecurity перед любым маршалингом.

int result = CoInitializeSecurity(IntPtr.Zero, -1,
 IntPtr.Zero, IntPtr.Zero,
            RpcAuthnLevel.Connect, RpcImpLevel.Impersonate,
            IntPtr.Zero, EoAuthnCap.DynamicCloaking, IntPtr.Zero);

но возвращает 80010119, что означает RPC_E_TOO_LATE.

Я знаю, что это означает, что CoInitializeSecurity уже был вызван. Но я хочу назвать эту функцию первой инструкцией в моем контракте. Я пытался вызвать CoInitializeSecurity даже в конструкторе службы, но он возвращает ту же ошибку. Это означает, что встроенные коды WCF содержат CoInitializeSecurity, и я не могу снова запустить эту функцию.

Я хочу вызвать com-объект и сделать так, чтобы com-объект работал с имитируемым пользователем в C #, но если я безумно успешен в вызове CoInitializeSecurity, это означает, что COM-объект не будет выполняться олицетворенным пользователем.


Только что добавлено после ответа @Remus Rusanu

Я заключил договор на обслуживание, подобный следующему

   [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string GetData()
    {
        MyComClass comObj = new MyComClass();
        string ComUser = comObj.GetLogOnUser();
        return System.Security.Principal.WindowsIdentity.GetCurrent().Name + " " + ComUser;
    }

и в клиенте я назвал эту службу желаемыми учетными данными

    ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
    client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
    client.ClientCredentials.Windows.ClientCredential.Domain = "Domain";
    client.ClientCredentials.Windows.ClientCredential.UserName = "DomainUser";
    client.ClientCredentials.Windows.ClientCredential.Password = "passw0rd";
    string str = client.GetData();

результат

DOMAIN \ DomainUser DOMAIN \ CurrentUser

Это означает, что WCF выдал себя за DomainUser, но внутри COM-объекта все еще работает с предыдущим пользователем.

1 Ответ

1 голос
/ 07 сентября 2010

Управляемый хостинг уже инициализирует COM для вас. Вам не нужно повторно инициализировать поток безопасности COM. Просто имитируйте в WCF (например, через [OperationBehavior(Impersonation=ImpersonationOption.Required)]) и создайте экземпляр объекта COM, это произойдет в олицетворенном контексте. Не то чтобы, если COM-объект является удаленным, происходит ограниченное делегирование, и ваш хост-процесс WCF должен быть настроен для ограниченного делегирования.

См. Как: олицетворять клиента в службе , Делегирование и олицетворение с помощью WCF и Включение делегированной аутентификации

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