客户端 - 服务器和Web应用程序之间的验证

时间:2014-10-28 13:08:53

标签: security session authentication web-applications client-server

我有两个应用程序,一个是桌面客户端,另一个是Web应用程序,可选择嵌入桌面客户端。两者都使用单独的数据库和单独的用户身份验证机制与单独的服服务器可以相互通信。

我需要能够登录桌面应用程序并使用嵌入式Web应用程序,而无需输入Web客户端的用户名/密码。

Web应用程序是在我们这边开发的,因此可以进行重大更改(在合理范围内)。架构是Windows上的.NET(IIS和SQL Server) 桌面应用程序是在别处开发的,因此更改应该是最小的发出http请求并传递令牌是可以的,但是创建一个新的身份验证机制并不是。架构未知,解决方案应该是平台无关的。

我可以在两台服务器之间使用某种信任来创建一次性身份验证令牌,桌面客户端可以将其传递给Web客户端来创建会话吗?

我可以插入这个或其他类似用例的现有实现吗?请注意,不得要求互联网连接,只能保证对两台服务器的访问。

如果没有任何简单/快速/免费的解决方案,我会想到这样的事情(D是桌面应用程序,W是Web应用程序):

  1. 用户登录客户端D并希望打开客户端W
  2. 服务器D向服务器W询问特定用户的令牌
  3. 服务器W创建一个新令牌,将其内部映射到请求的用户名并返回令牌
  4. 客户端D使用用户名和令牌
  5. 登录客户端W.
  6. 服务器W创建新会话并忘记令牌,以便不能再次使用
  7. 服务器之间的流量将通过SSL / TLS,IP白名单,使用预配置的密码进行身份验证,并包含唯一的计数器和时间戳以防止重放攻击。
    桌面客户端将通过嵌入式浏览器向服务器发出请求,从而与Web应用程序通信。对于身份验证,它会将用户名和令牌HTTPS POST到登录页面 客户端及其代表服务器之间的通信被认为是安全的。

    我还有什么遗失的吗?

    感谢。

1 个答案:

答案 0 :(得分:2)

我认为最不突兀的解决方案是最好的。我喜欢模块化身份验证的想法,您可以轻松地使用新的身份验证方法。您只需要两个活动的身份验证模块。

我们来看看服务器D:

  1. 用户名/密码验证。您获取用户名和密码,并根据数据库中的内容验证它(或希望它的哈希值)并返回令牌。带有返回令牌的请求将成功,直到令牌过期。
  2. 同行认证。您从请求中获取给定的会话令牌,并将其提交到服务器W进行验证。如果服务器W未返回200,则应禁止访问。这也是分享会话数据的好机会。
  3. 好像你已经在思考这条路了,但我建议你没有让服务器互相询问令牌。而是让服务器使用对该服务器有效的令牌互相询问会话数据。如果使用服务器D上的user / pass登录,请让服务器D为您提供对服务器D有效的会话令牌。然后,当与服务器W通信时,如果给定的会话令牌有效,请让服务器W询问服务器D.服务器D可以简单地返回yes / no或返回给定令牌的所有公共会话数据。

    此解决方案比您建议的解决方案至少有两个好处:

    1. 您不必保留两个令牌。您只需存储使用user / pass验证的最后一台服务器的令牌。这也使您能够处理服务器,就像他们使用相同的身份验证一样,如果您希望更改身份验证方法,将来可以提高灵活性。
    2. 令牌过期更直接。你不会有不匹配的到期处理。只要您的单个令牌已过期,您就不再使用任一服务器进行身份验证。
    3. 你怎么看?有意义吗?

      不过,我认为SSL可以防止重播攻击。