2010-01-03 18 views
43

में अलग क्लोकिंग/प्रतिरूपण मैं DCOM के साथ दो बातें (प्रक्रिया से बाहर)उपयोग डिफ़ॉल्ट प्रमाणीकरण और DCOM कॉल

  1. प्रक्रिया विस्तृत CoInitializeSecurity और उसके पैरामीटर pAuthList का उपयोग कर प्रमाणीकरण सेट प्राप्त कोशिश कर रहा हूँ।
  2. विशेष स्थितियों में फोन करने वाले की पहचान (COM कॉल)

मेरे विचार बदलने के लिए क्लोकिंग का उपयोग करना:

  1. प्रमाणन जानकारी संरचना AFAIK डिफ़ॉल्ट प्रमाणीकरण जानकारी (RPC_C_AUTHN_WINNT के लिए उपयोगकर्ता नाम और पासवर्ड की तरह होता है) सभी नए COM कॉल के लिए। तो प्रक्रिया टोकन की बजाय ऑथ संरचना में जानकारी COM द्वारा उपयोग की जानी चाहिए। हालांकि, सभी COM कॉल/कनेक्शन हमेशा लागू डिफ़ॉल्ट की बजाय प्रक्रिया 'पहचान का उपयोग कर रहे हैं।

  2. आमतौर पर, कोई प्रॉक्सी के लिए ऑथ जानकारी बदलने के लिए CoSetProxyBlanket का उपयोग कर सकता है। यह मेरे लिए काम करता है। मेरा सवाल यह है कि क्या मैं टोकन का प्रतिरूपण करता हूं और COM फ़ंक्शन को कॉल करता हूं, तो यह काम करना चाहिए या नहीं। मैंने विभिन्न एमएसडीएन लेखों में पढ़ा है जो CoOitializeSecurity को EOAC_DYNAMIC_CLOAKING को लागू करने से इसे काम करना चाहिए। लेकिन, मेरा मैन्युअल रूप से "प्रतिरूपित कॉम हमेशा कहता सर्वर साइड पर प्रक्रिया पहचान को दर्शाता है।

ग्राहक इस (डेल्फी) की तरह लग रहा

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 का उपयोग करता है। यह authInfo (SEC_WINNT_AUTH_IDENTITY_W संरचना के रूप में) प्राप्त करने के लिए CoQueryClientBlanket का भी उपयोग करता है। हालांकि दोनों कॉल हमेशा क्लाइंट की प्रक्रिया पहचान वापस करते हैं।

मैन्युअल रूप से प्रतिरूपण भी काम नहीं करता है (2):

Token := TJwSecurityToken.CreateLogonUser(authidentity.User, '', authidentity.Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT); 
Token.ImpersonateLoggedOnUser; 
int := CoSecurityTestObj.Create; 
int.TestCall; 

सवाल फिर से:

  1. मैं गलत हूँ या क्यों डिफ़ॉल्ट प्रमाणन जानकारी संरचना (WinNT उपयोगकर्ता नाम और पासवर्ड के साथ) में डिफ़ॉल्ट प्रमाणीकरण के रूप में इस्तेमाल नहीं किया है प्रत्येक COM कनेक्शन/कॉल?

  2. क्या मैं गलत हूं या मैन्युअल प्रतिरूपण क्यों नहीं करता? ध्यान रखें कि मैंने संख्या 2 का परीक्षण किया है। अलग-अलग संख्या 1. हस्तक्षेप नहीं कर सकता है।

जेडीआई विंडोज सुरक्षा कोड लाइब्रेरी के लिए यह मूल कार्य है जिसे मैं COM सुरक्षा का समर्थन करने के लिए विस्तारित करता हूं। तो आपकी मदद जीपीएल/एमपीएल जायेगी।

संदर्भ:

क्लोकिंग:

  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
+2

हल संख्या # 2। निरंतर EOAC_DYNAMIC_CLOAKING को गलत परिभाषित किया गया था। * stupidme * – ChristianWimmer

+0

मामले में 1. इसे वर्तमान पहचान का उपयोग करना चाहिए, लेकिन केवल तभी जब यह इसे प्रतिनिधि करने में सक्षम हो, जो केवल केर्बेरोज i.e. डोमेन वातावरण में है। इसके अलावा प्रक्रिया पहचान "प्रतिनिधिमंडल के लिए भरोसेमंद" होना चाहिए। यदि कोई रिमोट क्लाइंट है और आप किसी अन्य सर्वर (2 होप्स) पर कॉल करने का प्रयास कर रहे हैं तो विरासत एनटीएलएम प्रमाणीकरण इसकी अनुमति नहीं देगा। – Ben

उत्तर

1

आप के बजाय RPC_C_AUTHN_LEVEL_CALL RPC_C_AUTHN_LEVEL_CONNECT साथ CoInitializeSecurity() कॉल की कोशिश की?

आमतौर पर जब मैं डीसीओएम क्लाइंट बनाता हूं तो मैं कोसेरविनिनो बनाता हूं और सुरक्षा इंटरफेस के साथ CoCetaterostanceEx() को पास करता हूं, सभी इंटरफेस पर CoSetProxyBlanket() को कॉल करना याद करता है।

संबंधित मुद्दे