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

5
使用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?

非常感谢。

2个回答

3
您可以使用SQL凭据作为用户名和密码连接到DataSnap服务器。这些值可以在身份验证管理器中进行验证,或者直接转发到底层的SQLConnection组件以连接到SQL服务器。

谢谢,看起来这个方法可行 - 现在你指出来后很明显,但这可能为我节省了几天时间。 - RichardS

3
最安全的方法是传递用户安全令牌(加密),然后在服务器端使用集成安全性,在线程中模拟调用用户安全上下文。这样,用户/密码就永远不会通过网络发送。不幸的是,虽然MS / DCE RPC可以为每个调用执行此操作(而DCOM是在RPC之上构建的),但Datasnap不能执行此操作(SPNEGO / GSSAPI / SSPI对Embarcadero的人来说似乎过于复杂,他们喜欢简单、不安全的协议)。否则,非常小心地发送凭据,它们可能很容易被嗅探,除非正确地保护。
我建议您无论如何只发送一次凭据(如果需要,并以您能提供的最受保护的方式),然后在服务器端(使用Windows受保护的存储设施)将其受保护地存储,并向客户端发送一个句柄/会话令牌(绑定到原始IP),以用于后续调用,而不是每次重新发送凭据。当用户注销或会话超时时,信息将被清除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接