2010-01-03 26 views
43

Tôi đang cố gắng đạt được hai điều với DCOM (Out of quá trình)Sử dụng xác thực mặc định và riêng biệt che đậy/mạo danh trong DCOM gọi

  1. Đặt xác thực rộng quá trình sử dụng CoInitializeSecurity và pAuthList tham số của nó.
  2. Sử dụng che đậy để thay đổi danh tính của người gọi trong những tình huống đặc biệt (gọi COM)

những suy nghĩ của tôi:

  1. AFAIK cấu trúc thông tin auth chứa các thông tin xác thực mặc định (như tên đăng nhập và mật khẩu cho RPC_C_AUTHN_WINNT) cho tất cả các cuộc gọi COM mới. Vì vậy, thay vì mã thông báo quá trình, thông tin trong cấu trúc auth nên được COM sử dụng. Tuy nhiên, tất cả các cuộc gọi/kết nối COM luôn sử dụng danh tính của quá trình thay vì mặc định được áp dụng.

  2. Thông thường, người ta có thể sử dụng CoSetProxyBlanket để thay đổi thông tin xác thực cho proxy. Điều này làm việc cho tôi. Câu hỏi của tôi ở đây là liệu nó có hay không phải không hoạt động nếu tôi mạo danh bản thân mã thông báo và gọi hàm COM. Tôi đã đọc trong các bài viết MSDN khác nhau áp dụng EOAC_DYNAMIC_CLOAKING cho CoInitializeSecurity để làm cho nó hoạt động. Tuy nhiên, COM bằng tay" mạo nhận của tôi gọi luôn cho thấy bản sắc quá trình trên phía máy chủ.

Client trông như thế này (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; 

Các máy chủ cũng đã thiết lập các EOAC_DYNAMIC_CLOAKING cờ. Nó sử dụng CoImpersonateClient để lấy mã thông báo chủ đề và tên người dùng, nó cũng sử dụng CoQueryClientBlanket để lấy cấu hình authInfo (như cấu trúc SEC_WINNT_AUTH_IDENTITY_W), tuy nhiên cả hai cuộc gọi luôn luôn trả về danh tính của máy khách. không hoạt động (2):

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

câu hỏi một lần nữa:

  1. Tôi có sai lầm hay tại sao cấu trúc thông tin auth mặc định (WinNT với Tên truy nhập và mật khẩu) không được sử dụng như xác thực mặc định trong mỗi kết nối/cuộc gọi COM?

  2. Tôi có sai hoặc tại sao công việc mạo danh thủ công không? Hãy lưu ý rằng tôi đã thử nghiệm số 2. một cách riêng biệt để số 1. không thể can thiệp.

Đây là công việc cơ bản cho Thư viện mã bảo mật Windows JEDI mà tôi mở rộng để hỗ trợ bảo mật COM. Vì vậy, sự giúp đỡ của bạn sẽ đi GPL/MPL.

Tài liệu tham khảo:

Cloaking:

  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 và pAuthInfo

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

Bắt chăn an ninh (server side)

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

Số được giải quyết # 2. EOAC_DYNAMIC_CLOAKING không đổi được định nghĩa sai. * stupidme * – ChristianWimmer

+0

Trong trường hợp 1. nó nên sử dụng danh tính hiện tại nhưng chỉ khi nó có thể ủy quyền nó, mà chỉ trong một môi trường miền Kerberos tức là. Ngoài ra, bản sắc quá trình phải "đáng tin cậy để ủy quyền". Nếu có một máy khách từ xa và bạn đang cố gắng gọi đến một máy chủ khác (2 bước) xác thực NTLM kế thừa sẽ không cho phép điều đó. – Ben

Trả lời

1

Bạn đã thử gọi CoInitializeSecurity() với RPC_C_AUTHN_LEVEL_CALL thay vì RPC_C_AUTHN_LEVEL_CONNECT?

Thông thường khi tạo khách hàng DCOM, tôi tạo COSERVERINFO và chuyển đến CoCreateInstanceEx() bằng thông tin xác thực bảo mật, nhớ gọi CoSetProxyBlanket() trên tất cả các giao diện.

Các vấn đề liên quan