Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL登录凭据传递到Delphi Datasnap服务器的最有效方法?_Delphi_Datasnap - Fatal编程技术网

将SQL登录凭据传递到Delphi Datasnap服务器的最有效方法?

将SQL登录凭据传递到Delphi Datasnap服务器的最有效方法?,delphi,datasnap,Delphi,Datasnap,使用Delphi XE使用Datasnap构建一个相对简单的数据库应用程序 由于应用程序中的某些安全性是在数据库级别处理的,因此我需要将用户的SQL凭据从客户端应用程序传递到Datasnap服务器 (如果可能的话,我正在尝试使Datasnap服务器成为无状态的,因此要认识到,我必须为每次调用都这样做。) 我在客户端使用ClientDataSet(CD),因此我可以使用OnBeforeGetRecords将OwnerData OleVariant中的数据从客户端的CD传递到服务器上相应的TData

使用Delphi XE使用Datasnap构建一个相对简单的数据库应用程序

由于应用程序中的某些安全性是在数据库级别处理的,因此我需要将用户的SQL凭据从客户端应用程序传递到Datasnap服务器

(如果可能的话,我正在尝试使Datasnap服务器成为无状态的,因此要认识到,我必须为每次调用都这样做。)

我在客户端使用ClientDataSet(CD),因此我可以使用OnBeforeGetRecords将OwnerData OleVariant中的数据从客户端的CD传递到服务器上相应的TDataSetProvider。但这意味着每个数据模块上的每一张CD都必须有一个这样做的事件,这看起来很混乱和笨拙。我忍不住感到,必须有一种方法可以将消息传递到服务器的更高级别

在服务器端的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


非常感谢。

您可以使用SQL凭据作为用户名和密码连接到DataSnap服务器。这些值可以在身份验证管理器中进行验证和/或转发到基础SQLConnection组件以连接到SQL server

最安全的方法是传递用户安全令牌(加密),然后在服务器端使用集成安全性,在线程中模拟调用用户安全上下文。这样就不会通过网络发送任何用户/密码。不幸的是,虽然MS/DCE RPC可以为每个调用(以及在RPC之上构建的DCOM)执行此操作,但Datasnap却不能(对于Embarcadero的员工来说,SPNEGO/GSSAPI/SSPI看起来很复杂,他们喜欢简单、不安全的协议)。否则,在通过网络发送凭据时要非常小心,除非得到适当的保护,否则它们很容易被嗅探


无论如何,我建议您只发送一次,如果需要的话(并且以最受保护的方式),然后将它们存储在服务器端(使用受Windows保护的存储设施),并将句柄/会话令牌(绑定到原始IP)发送回客户机,用于后续调用,而不是每次重新发送凭据。当用户注销或会话超时时,信息将被清除。

谢谢,这似乎有效-现在你指出这一点很明显,但这可能节省了我几天的时间。