如何使用Windows身份验证对中间层上的用户进行身份验证

时间:2010-12-16 14:07:41

标签: windows delphi winapi authentication windows-authentication

我们有一个用Delphi编写的服务器,它使用RemObjects DataAbstract / SDK。我们希望使用Windows身份验证对用户进行身份验证,以允许他们访问我们的服务器。

目前我们执行以下操作:

1)客户端应用程序以明文形式将Windows用户名和密码发送到服务器。 2)服务器使用以下函数检查凭据:

function ValidateUserLogonAPI(const UserName: string; const Domain: string;
  const PassWord: string) : boolean;
var
  Retvar: boolean;
  LHandle: THandle;
begin
  Retvar := LogonUser(PWideChar(UserName),
                                PWideChar(Domain),
                                PWideChar(PassWord),
                                LOGON32_LOGON_NETWORK,
                                LOGON32_PROVIDER_DEFAULT,
                                LHandle);

  if Retvar then
    CloseHandle(LHandle);

  Result := Retvar;
end;

当然,此方法的缺点是用户凭据以明文形式通过网络传递。我们可以对它们进行加密,但加密/解密密钥必须在应用程序中发送。

我确信必须有更好的方法来实现我们的目标。我已经阅读了一些关于令牌的内容,但是我真的不明白它们在这种情况下会如何工作。

请注意,她的解决方案必须适用于Delphi Windows客户端和Delphi Prism ASP.NET客户端。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

这就是DataAbstract应该自己处理的事情,如果不是这样,它就是Datasnap的半支持库:)当谈到远程处理时,验证/授权端点和保护数据交换非常关键。

基本上,您必须不发送用户凭据,而是交换客户端和服务器都知道如何进行身份验证的“令牌”。完整的解释可能很复杂。您可以从MSDN开始(查找AcceptSecurityContext()和InitializeSecurityContext())。一个可能的问题是,如果DataAbastract有适当的钩子来实现身份验证阶段,这可能需要多次往返。

作为权宜之计,您可以启用IPSec来保护通信渠道,并且不要让整个用户帐户轻易被“嗅探”。