Я пытаюсь создать службу 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-объекта все еще работает с предыдущим пользователем.