我有一个用经典ASP编写的webservice。在这个web服务中,它尝试通过DCOM在另一个服务器上创建一个VirtualServer.Application对象。这在拒绝许可的情况下失败。但是,我在同一个远程服务器上的同一个the服务中实例化了另一个组件,该组件的创建没有问题。此组件是自定义内部组件。
via服务是从一个独立的EXE程序中调用的,该程序通过WinHTTP调用它。已经证实,WinHTTP正在成功地通过Kerberos对webservice进行身份验证。通过The服务身份验证的用户是Administrator用户。EXE到webservice身份验证步骤是成功的,并且使用了kerberos。
我已经用DCOMCNFG在远程计算机上验证了DCOM权限。默认限制允许管理员进行本地和远程激活,包括本地和远程访问,以及本地和远程启动。默认组件权限允许相同。这一点已得到证实。工作组件的各个组件权限设置为默认值。VirtualServer.Application组件的各个组件权限也设置为默认值。基于这些设置,webservice应该能够实例化并访问远程计算机上的组件。
在运行这两个测试时,设置一个Wireshark跟踪,一个测试使用工作组件,另一个测试使用VirtualServer.Application组件,这将显示一个无穷无尽的行为。当webservice实例化工作、自定义组件时,我可以看到连接上对RPCSS端点映射程序的请求,首先执行TCP连接序列。然后,我看到它使用适当的安全包执行绑定请求,在本例中是kerberos。在获得工作DCOM组件的端点之后,它通过Kerberos再次连接到DCOM端点身份验证,并且能够成功地实例化和通信。
在失败的VirtualServer.Application组件上,我再次看到使用kerberos的绑定请求成功地转到RPCC终端映射程序。但是,当它试图连接到Virtual进程中的端点时,它失败了,因为它只尝试使用NTLM进行身份验证,这最终失败了,因为webservice无法访问凭据来执行NTLM哈希。
为什么它试图通过NTLM进行身份验证?
其他信息:
有谁知道在远程服务器上创建VirtualServer.Application对象的尝试为什么会退回到NTLM身份验证,导致其失败并被拒绝权限?
附加信息:当以下代码在webservice上下文中运行时,直接通过仅测试的、刚刚开发的COM组件运行时,它将在指定的行上失败,访问被拒绝。
COSERVERINFO csi;
csi.dwReserved1=0;
csi.pwszName=L"terahnee.rivin.net";
csi.pAuthInfo=NULL;
csi.dwReserved2=NULL;
hr=CoGetClassObject(CLSID_VirtualServer, CLSCTX_ALL, &csi, IID_IClassFactory, (void **) &pClsFact);
if(FAILED( hr )) goto error1;
// Fails here with HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)
hr=pClsFact->CreateInstance(NULL, IID_IUnknown, (void **) &pUnk);
if(FAILED( hr )) goto error2;我还注意到,在Wireshark跟踪中,我看到试图连接到服务流程组件的尝试只请求NTLMSSP身份验证,甚至不会使用kerberos。这表明,由于某种原因,webservice认为它不能使用kerberos.
发布于 2011-04-29 20:42:11
NTLM身份验证回退是一种症状。真正的问题是为什么Kerberos失败了。
这听起来像是一个典型的情况,即所获得的模拟级别不足以执行所请求的活动。在Kerberos中使用委托,如果正在模拟的机器或进程没有“模拟”令牌,而是具有较低的令牌(如" identity“),则请求Kerberos身份验证在使用另一个标识时访问资源将失败。
有四种类型的模拟令牌:
匿名
身份
冒充
委派
“模拟”允许模拟访问执行模拟的进程所在的同一台计算机上的资源。如果执行模拟的进程在不同的计算机上访问资源,而不是在执行模拟时,则需要一个“委托”令牌。这通常需要TCB特权(Act作为操作系统的一部分)。
TokenImpersonationLevel枚举
http://msdn.microsoft.com/en-us/library/system.security.principal.tokenimpersonationlevel%28v=vs.80%29.aspx
注意,Windows XP/Server 2003中的DCOM默认模拟级别是"Identity“。这意味着进程可能无法在模拟另一个标识时访问资源。您可能需要对计算机级或进程级安全配置进行实验,以找出什么是有效的。您可能会发现,需要启用加密才能连接到某些资源。配置一个与另一个服务相同的服务可能不是苹果-苹果比较。
不同操作系统之间的连接
http://msdn.microsoft.com/en-us/library/aa389284%28v=vs.85%29.aspx
使用DCOMCNFG设置系统范围的安全性
http://msdn.microsoft.com/en-us/library/ms680051%28v=vs.85%29.aspx
使用C++设置默认进程安全级别
http://msdn.microsoft.com/en-us/library/aa393617%28v=vs.85%29.aspx
https://serverfault.com/questions/264853
复制相似问题