5

Delphi XE を使用して、Datasnap を使用した比較的単純なデータベース アプリを構築します。

アプリケーションの一部のセキュリティはデータベース レベルで処理されるため、ユーザーの SQL 資格情報をクライアント アプリから Datasnap サーバーに渡す必要があります。

(可能であれば、Datasnap サーバーをステートレスにしようとしているので、呼び出しごとにこれを行う必要があることを認識してください。)

クライアント側で ClientDatasets (CDS) を使用しているので、OnBeforeGetRecords を使用して、OwnerData OleVariant のデータをクライアントの CDS からサーバーの対応する TDataSetProvider に渡すことができます。しかし、これは、すべてのデータ モジュールのすべての CDS が、これを行うイベントを持たなければならないことを意味します。それよりも高いレベルでメッセージをサーバーに渡す方法がなければならないと感じずにはいられません。

私が本当に欲しいのは、サーバー側の DSServerClass レベルで次のようなものです。

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;

Authentication Manager コンポーネントはここで役に立ちますか? 他のアイデアはありますか?または、OnBeforeGetRecords にこだわっていますか?

どうもありがとう。

4

2 に答える 2

3

最も安全な方法は、ユーザー セキュリティ トークン (暗号化) を渡し、サーバー側で統合セキュリティを使用して、呼び出し元のユーザー セキュリティ コンテキストをスレッドで偽装することです。このようにして、ユーザー/パスワードがネットワークを介して送信されることはありません。残念なことに、MS/DCE RPC はすべての呼び出し (および RPC の上に構築されている DCOM) に対してこれを行うことができますが、Datasnap はできません (Embarcadero の担当者にとって SPNEGO/GSSAPI/SSPI は複雑に見えます。彼らは単純で安全でないプロトコルが好きです)。そうしないと、ネットワークを介して資格情報を送信する方法に十分注意してください。適切に保護されていないと、簡単に傍受される可能性があります。

とにかく、必要に応じて(そしてできる限り保護された方法で)一度だけ送信し、サーバー側で保護された状態で保存し(Windows保護ストレージ機能を使用)、クライアントに返信することをお勧めします。毎回資格情報を再送信する代わりに、後続の呼び出しで使用されるハンドル/セッション トークン (元の IP に関連付けられている)。ユーザーがログオフするか、セッションがタイムアウトすると、情報は消去されます。

于 2012-04-17T13:02:53.843 に答える
3

DataSnap サーバーに接続するためのユーザー名とパスワードとして SQL 資格情報を使用できます。これらの値は、Authentication Manager で検証したり、SQL サーバーに接続するために基になる SQLConnection コンポーネントに単純に転送したりできます。

于 2012-04-17T12:25:13.960 に答える