最有效的方式来传递SQL登录凭据德尔福的DataSnap服务器?(Most efficient wa

2019-07-29 01:04发布

用Delphi XE采用的DataSnap建立一个相对简单的数据库应用程序。

因为在我的应用程序的一些安全性在数据库级别的处理,我需要从我的客户端应用程序传递用户的SQL凭据我DataSnap服务器。

(我试图使DataSnap服务器无国籍如果可能的话,所以承认,我将不得不在每次调用做到这一点。)

我使用在客户端ClientDatasets(CDS),所以我可以用OnBeforeGetRecords从CDS通过在客户端上的OwnerData OleVariant数据到服务器上相应的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;

可以在认证管理器组件帮助我在这里? 任何其他的想法? 还是我坚持OnBeforeGetRecords?

非常感谢。

Answer 1:

您可以使用SQL凭据用户名和密码连接到DataSnap服务器。 这些值可以在验证管理器进行验证和/或简单地转发到基础SQLConnection组件,用于连接到SQL服务器。



Answer 2:

最安全的方法是沿着用户安全令牌传递(加密),然后使用服务器端的冒充集成的安全性在一个线程调用用户的安全上下文。 这样,没有用户/密码将永远跨网发送。 不幸而MS / DCE RPC能做到这一点,每调用(和DCOM,被上面的RPC建)的DataSnap不能(SPNEGO / GSSAPI / SSPI看起来复杂,在Embarcadero公司的人,他们喜欢简单的,不安全的协议)。 否则,必须非常小心,你在网络上发送证书的方式,他们可以很容易地嗅了嗅,除非适当的保护。

我想反正建议你给他们只有一次,如果你需要(在最受保护的方式,您可以),然后把它们存储在服务器端保护(起诉Windows保护存储设备),并发送回客户端的处理/会话令牌(绑到始发IP),以便在随后的调用而不是每次都重新发送证书被使用。 当用户注销或会话超时信息将被清除。



文章来源: Most efficient way to pass SQL Login credentials to Delphi Datasnap servers?