在DCOM调用中使用默认身份validation和单独的隐藏/模拟

我试图用DCOM实现两件事情(Out of process)

  1. 使用CoInitializeSecurity及其参数pAuthList设置进程范围的身份validation。
  2. 在特殊情况下使用隐形来改变呼叫者的身份(COM呼叫)

我的想法:

  1. AFAIK身份validation信息结构包含所有新的COM调用的默认身份validation信息(如RPC_C_AUTHN_WINNT的用户名和密码)。 所以,代替进程标记,auth结构中的信息应该被COM使用。 但是,所有COM调用/连接始终使用进程的身份而不是应用的默认进程。

  2. 通常,可以使用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; 

再次质疑:

  1. 我错了,或者为什么默认身份validation信息结构(用户名和密码的WinNT)没有用作默认身份validation在每个COM连接/调用?

  2. 我错了,为什么不手动模拟工作? 请注意,我testing了数字2.分开数字1.不能干涉。

这是JEDI Windows安全代码库的基础工作,我扩展了它以支持COM安全性。 所以你的帮助将会是GPL / MPL。

参考文献:

伪装:

  1. http://msdn.microsoft.com/en-us/library/ms683778%28VS.85%29.aspx
  2. http://msdn.microsoft.com/en-us/library/cc246058%28PROT.10%29.aspx
  3. http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsCoInitializeSecurity.html

CoInitializeSecurity和pAuthInfo

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/93.htm

获取安全毯(服务器端)

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/92.htm

您是否尝试过使用RPC_C_AUTHN_LEVEL_CALL而不是RPC_C_AUTHN_LEVEL_CONNECT调用CoInitializeSecurity()?

通常,当我创buildDCO​​M客户端时,我创build了COSERVERINFO并将其传递给CoCreateInstanceEx(),并记住在所有接口上调用CoSetProxyBlanket()。