【发布时间】:2010-09-07 00:15:07
【问题描述】:
我正在尝试创建一个 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 对象内部仍在与以前的用户合作。
【问题讨论】:
标签: c# wcf com impersonation