【问题标题】:Authentication between client-server and web applications客户端-服务器和 Web 应用程序之间的身份验证
【发布时间】:2014-12-23 21:49:34
【问题描述】:

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

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

网络应用程序是在我们这边开发的,因此可以进行重大更改(在合理范围内)。体系结构是 Windows 上的 .NET(IIS 和 SQL Server)。
桌面应用程序是在其他地方开发的,因此更改应该是最小的;发出 http 请求并传递令牌是可以的,但创建新的身份验证机制则不行。架构未知,解决方案应该独立于平台。

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

我可以加入这个或其他类似用例的任何现有实现吗?请注意,不一定需要互联网连接,只保证可以访问两台服务器。

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

  1. 用户登录客户端 D 并希望打开客户端 W
  2. 服务器 D 向服务器 W 请求特定用户的令牌
  3. 服务器 W 创建一个新令牌,在内部将其映射到请求的用户名并返回该令牌
  4. 客户端 D 使用用户名和令牌登录客户端 W
  5. 服务器 W 创建一个新会话并忘记了令牌,因此无法再次使用它

服务器之间的流量将通过 SSL/TLS、IP 白名单、使用预配置的密码进行身份验证,并包括一个唯一的计数器和时间戳以防止重放攻击。
桌面客户端将通过嵌入式浏览器向服务器发出请求来与 Web 应用程序通信。对于身份验证,它将通过 HTTPS 将用户名和令牌发布到登录页面。
假定客户端与其代表服务器之间的通信是安全的。

我还缺少什么吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    我们来看看服务器D:

    1. 用户名/密码验证。您获取用户名和密码并根据数据库中的内容验证它(或希望它的哈希值)并返回一个令牌。使用返回的令牌的请求将成功,直到令牌过期。
    2. 对等身份验证。您从请求中获取给定的会话令牌并将其提交给服务器 W 进行验证。如果服务器 W 没有返回 200,您应该禁止访问。这也是分享会话数据的好机会。

    您似乎已经在考虑这条路了,但我建议您不要让服务器互相询问令牌。而是让服务器使用对该服务器有效的令牌相互询问会话数据。如果您在服务器 D 上使用用户/密码登录,则让服务器 D 给您一个对服务器 D 有效的会话令牌。然后在与服务器 W 通信时,让服务器 W 询问服务器 D 给定的会话令牌是否有效。服务器 D 可以简单地返回是/否或返回给定令牌的所有公共会话数据。

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

    1. 您不必保留两个令牌。您只需存储您使用用户/通行证进行身份验证的最后一个服务器给您的任何令牌。这也使您能够像使用相同的身份验证一样处理服务器,如果您希望更改身份验证方法,这将使您在未来更加灵活。
    2. 令牌过期更直接。你不会有不匹配的到期来处理。每当您的单一令牌过期时,您就不再通过任一服务器进行身份验证。

    你怎么看?有意义吗?

    顺便说一句,我认为 SSL 可以防止重放攻击。

    【讨论】:

    • 很好,这样干净多了!另外,感谢您对 SSL 和重放攻击的提醒 :)
    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 2011-11-04
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多