2012-04-17 36 views
5

Sử dụng Delphi XE để tạo ứng dụng cơ sở dữ liệu tương đối đơn giản bằng Datasnap.Cách hiệu quả nhất để chuyển thông tin đăng nhập SQL cho máy chủ Delphi Datasnap?

Vì một số bảo mật trong ứng dụng của tôi được xử lý ở cấp cơ sở dữ liệu, tôi cần chuyển thông tin đăng nhập SQL của người dùng từ ứng dụng khách đến máy chủ Datasnap của tôi.

(Tôi đang cố gắng để làm cho máy chủ Datasnap không quốc tịch nếu có thể, vì vậy nhận thức được rằng tôi sẽ phải làm điều này cho mỗi cuộc gọi.)

Tôi đang sử dụng ClientDatasets (CDS) về phía khách hàng vì vậy tôi có thể sử dụng OnBeforeGetRecords để truyền dữ liệu trong PropertyData OleVariant từ CDS trên máy khách đến TDataSetProvider tương ứng trên máy chủ. Nhưng điều đó có nghĩa là mọi CDS đơn trên mọi mô-đun dữ liệu phải có một sự kiện thực hiện điều này, điều này có vẻ lộn xộn và khó sử dụng. Tôi không thể không cảm thấy phải có một cách để truyền thông điệp đến máy chủ ở mức cao hơn thế.

một cái gì đó như thế này ở cấp DSServerClass ở phía máy chủ Những gì tôi thực sự muốn là:

Procedure TMyServerContainer.MyServerClassCreateInstance(DSCreateInstanceEventObject: TDSCreateInstanceEventObject); 
begin 
// Server detects request for data from client app 
fUsername := GetUsernameFromClientSomehow; 
fPassword := GetPasswordFromClientSomehow; 

// create data modules and initialise 
MyDataModule := TMyDataModule.Create(nil); 
MyDataModule.InitialiseWithSQLCredentials(fUsername, fPassword); 
DSCreateInstanceEventObject.ServerClassInstance := MyDataModule; 
End; 

thành phần Xác thực quản lý có thể giúp tôi ở đây? Bất kỳ ý tưởng nào khác? Hay tôi bị mắc kẹt với OnBeforeGetRecords?

Rất cám ơn.

Trả lời

3

Bạn có thể sử dụng thông tin đăng nhập SQL làm Tên người dùng và Mật khẩu để kết nối với máy chủ DataSnap. Các giá trị này có thể được xác minh trong Trình quản lý xác thực và/hoặc đơn giản được chuyển tiếp đến thành phần SQLConnection bên dưới để kết nối với máy chủ SQL.

+0

Cảm ơn bạn, điều đó dường như hoạt động - rõ ràng bây giờ bạn chỉ ra điều đó nhưng điều đó có thể đã cứu tôi ngày. – RichardS

3

Cách an toàn nhất là chuyển mã thông báo bảo mật của người dùng (mã hóa) và sau đó sử dụng bảo mật tích hợp ở phía máy chủ mạo danh trong một luồng ngữ cảnh bảo mật người dùng gọi điện. Bằng cách này, không có người dùng/mật khẩu nào được gửi qua dây. Thật không may trong khi MS/DCE RPC có thể thực hiện điều này cho mọi cuộc gọi (và DCOM, được xây dựng trên RPC), Datasnap không thể (SPNEGO/GSSAPI/SSPI trông phức tạp đối với những kẻ ở Embarcadero, họ thích giao thức đơn giản, không an toàn). Nếu không, hãy cẩn thận với cách bạn gửi thông tin đăng nhập qua mạng, chúng có thể dễ dàng bị ngửi trừ khi được bảo vệ đúng cách.

Tôi sẽ khuyên bạn chỉ gửi cho họ một lần, nếu bạn cần (và theo cách bảo vệ nhất có thể), sau đó lưu trữ chúng được bảo vệ ở phía máy chủ (kiện các cơ sở lưu trữ được bảo vệ của Windows) và gửi lại cho khách hàng một mã thông báo xử lý/phiên (gắn với IP ban đầu), được sử dụng trong các cuộc gọi tiếp theo thay vì gửi lại thông tin đăng nhập mỗi lần. Thông tin được xóa khi người dùng đăng xuất hoặc hết thời gian chờ phiên.

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