security - powertrain - Usar autenticación predeterminada y ocultación/suplantación por separado en la llamada DCOM
delphi products (1)
¿Has intentado llamar a CoInitializeSecurity () con RPC_C_AUTHN_LEVEL_CALL en lugar de RPC_C_AUTHN_LEVEL_CONNECT?
Por lo general, cuando creo clientes DCOM, creo COSERVERINFO y paso a CoCreateInstanceEx () con credenciales de seguridad, recordando llamar a CoSetProxyBlanket () en todas las interfaces.
Intento lograr dos cosas con DCOM (Fuera de proceso)
- Establezca la autenticación de todo el proceso utilizando CoInitializeSecurity y su parámetro pAuthList.
- Usar encubrimiento para cambiar la identidad de la persona que llama en situaciones especiales (llamadas COM)
Mis pensamientos:
AFAIK la estructura de información de autenticación contiene la información de autenticación predeterminada (como nombre de usuario y contraseña para RPC_C_AUTHN_WINNT) para todas las llamadas COM nuevas. Entonces, en lugar del token de proceso, la información en la estructura de autenticación debería ser utilizada por COM. Sin embargo, todas las llamadas / conexiones COM siempre usan la identidad del proceso en lugar de la predeterminada.
Por lo general, uno puede usar CoSetProxyBlanket para cambiar la información de autenticación de un proxy. Esto funciona para mí Mi pregunta aquí es si debe o no funcionar si me hago pasar por el token y llamo a la función COM. He leído en varios artículos de MSDN que aplicar EOAC_DYNAMIC_CLOAKING a CoInitializeSecurity debería hacerlo funcionar. Sin embargo, mis llamadas COM suplantadas manualmente siempre muestran la identidad del proceso en el lado del servidor.
El cliente se ve así (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;
El servidor también ha establecido el indicador EOAC_DYNAMIC_CLOAKING. Utiliza CoImpersonateClient para obtener el token de hilo y el nombre de usuario. También usa CoQueryClientBlanket para obtener authInfo (como estructura SEC_WINNT_AUTH_IDENTITY_W). Sin embargo, ambas llamadas siempre devuelven la identidad del proceso del cliente.
También suplantar manualmente no funciona (2.):
Token := TJwSecurityToken.CreateLogonUser(authidentity.User, '''', authidentity.Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT);
Token.ImpersonateLoggedOnUser;
int := CoSecurityTestObj.Create;
int.TestCall;
Preguntas de nuevo:
¿Estoy equivocado o por qué la estructura de información de autenticación predeterminada (WinNT con nombre de usuario y contraseña) no se utiliza como autenticación predeterminada en cada conexión / llamada COM?
¿Estoy equivocado o por qué no funciona la suplantación manual? Tenga en cuenta que probé el número 2. por separado, por lo que el número 1. no puede interferir.
Este es un trabajo básico para la Biblioteca de códigos de seguridad de JEDI Windows, que amplío para admitir la seguridad COM. Entonces tu ayuda será GPL / MPL.
Referencias
Encubierto:
- 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 y pAuthInfo
Obtener manta de seguridad (lado del servidor)