繁体   English   中英

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

[英]Most efficient way to pass SQL Login credentials to Delphi Datasnap servers?

使用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;

身份验证管理器组件可以在这里帮助我吗? 还有其他想法吗? 还是我坚持使用OnBeforeGetRecords?

非常感谢。

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

最安全的方法是传递用户安全令牌(加密),然后在服务器端使用集成安全性,在线程中模拟调用用户安全性上下文。 这样,用户/密码都不会通过网络发送。 不幸的是,尽管MS / DCE RPC可以为每个调用做到这一点(而且DCOM是在RPC之上构建的),但Datasnap却不能(对于Embarcadero的人来说SPNEGO / GSSAPI / SSPI看起来很复杂,他们喜欢简单,不安全的协议)。 否则,请小心通过网络发送证书的方式,除非受到适当的保护,否则很容易发现它们。

无论如何,我都会建议您只发送一次(如果需要的话),然后将其存储在服务器端(使用受Windows保护的存储设施),然后将其发送回客户端。处理/会话令牌(绑定到原始IP),将在后续调用中使用,而不是每次都重新发送凭据。 用户注销或会话超时时,将清除信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM