在DCOM调用中使用默认身份validation和单独的隐藏/模拟
我试图用DCOM实现两件事情(Out of process)
- 使用CoInitializeSecurity及其参数pAuthList设置进程范围的身份validation。
- 在特殊情况下使用隐形来改变呼叫者的身份(COM呼叫)
我的想法:
-
AFAIK身份validation信息结构包含所有新的COM调用的默认身份validation信息(如RPC_C_AUTHN_WINNT的用户名和密码)。 所以,代替进程标记,auth结构中的信息应该被COM使用。 但是,所有COM调用/连接始终使用进程的身份而不是应用的默认进程。
-
通常,可以使用CoSetProxyBlanket来更改代理的身份validation信息。 这对我有用。 我的问题是,如果我自己模拟令牌并调用COM函数,它是否必须工作。 我读过各种MSDN文章,应用EOAC_DYNAMIC_CLOAKING到CoInitializeSecurity应该使其工作。 但是,我手动“模拟的COM调用总是显示服务器端的进程标识。
客户端看起来像这样(Delphi)
var authList : SOLE_AUTHENTICATION_LIST; authidentity : SEC_WINNT_AUTH_IDENTITY_W; authInfo : array[0..1] of SOLE_AUTHENTICATION_INFO; pcAuthSvc : DWORD; asAuthSvc : array[0..0] of SOLE_AUTHENTICATION_SERVICE; Token : TJwSecurityToken; begin ZeroMemory( @authidentity, sizeof(authidentity) ); authidentity.User := 'Testbenutzer'; authidentity.UserLength := Length('Testbenutzer'); authidentity.Domain := ''; authidentity.DomainLength := 0; authidentity.Password := 'test'; authidentity.PasswordLength := 4; authidentity.Flags := SEC_WINNT_AUTH_IDENTITY_UNICODE; ZeroMemory( @authInfo, sizeof( authInfo ) ); // NTLM Settings authInfo[0].dwAuthnSvc := RPC_C_AUTHN_WINNT; authInfo[0].dwAuthzSvc := RPC_C_AUTHZ_NONE; authInfo[0].pAuthInfo := @authidentity; authList.cAuthInfo := 1; authList.aAuthInfo := @authInfo; OleCheck(CoInitializeSecurity( NULL, // Security descriptor -1, // Count of entries in asAuthSvc NULL, // asAuthSvc array NULL, // Reserved for future use RPC_C_AUTHN_LEVEL_CONNECT, // Authentication level RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation level @authList, // Authentication Information DWORd(EOAC_DYNAMIC_CLOAKING), // Additional capabilities NULL // Reserved )); //create COM object int := CoSecurityTestObj.Create; int.TestCall;
服务器也设置了标志EOAC_DYNAMIC_CLOAKING。 它使用CoImpersonateClient获取线程令牌和用户名。 它还使用CoQueryClientBlanket来获取authInfo(如SEC_WINNT_AUTH_IDENTITY_W结构)。 但是,这两个调用总是返回客户端的进程标识。
还手动模拟不起作用(2.):
Token := TJwSecurityToken.CreateLogonUser(authidentity.User, '', authidentity.Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT); Token.ImpersonateLoggedOnUser; int := CoSecurityTestObj.Create; int.TestCall;
再次质疑:
-
我错了,或者为什么默认身份validation信息结构(用户名和密码的WinNT)没有用作默认身份validation在每个COM连接/调用?
-
我错了,为什么不手动模拟工作? 请注意,我testing了数字2.分开数字1.不能干涉。
这是JEDI Windows安全代码库的基础工作,我扩展了它以支持COM安全性。 所以你的帮助将会是GPL / MPL。
参考文献:
伪装:
- http://msdn.microsoft.com/en-us/library/ms683778%28VS.85%29.aspx
- http://msdn.microsoft.com/en-us/library/cc246058%28PROT.10%29.aspx
- http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsCoInitializeSecurity.html
CoInitializeSecurity和pAuthInfo
- http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/93.htm
获取安全毯(服务器端)
- http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/92.htm
您是否尝试过使用RPC_C_AUTHN_LEVEL_CALL而不是RPC_C_AUTHN_LEVEL_CONNECT调用CoInitializeSecurity()?
通常,当我创buildDCOM客户端时,我创build了COSERVERINFO并将其传递给CoCreateInstanceEx(),并记住在所有接口上调用CoSetProxyBlanket()。