1

我正在编写一个使用 WCF 与 Web 服务通信的应用程序。数据库还用于存储与用户相关的数据,例如凭据。数据库中的密码是散列+加盐的。

用户必须使用提供给他的用户名和密码手动登录。然后,应用程序使用代理与负责身份验证的 Web 服务进行通信。Web 服务然后检查用户是否存在并将数据返回给客户端,然后客户端显示数据。否则,如果凭据无效或服务器无法访问,则会显示错误。

我的问题:

  • 为了减少 Web 服务完成的工作量,我希望由客户端完成身份验证过程。换句话说,客户端将用户名发送到 Web 服务,然后 Web 服务检查数据库中是否存在“用户”表中该用户名的条目。如果是,Web 服务将散列和加盐的密码(来自数据库)返回给客户端。然后客户端将用户输入的密码与获得的哈希/加盐密码进行比较。没有解密,输入的密码只是使用相同的盐字节进行哈希处理,然后比较密码。

    这是可以接受的行为吗?

  • 如果在数据库中找不到提供的用户名,我应该如何处理?服务器是否应该抛出异常,然后由客户端处理?或者我应该将身份验证部分分为两个步骤:

    1)确保用户存在。

    2)从数据库中获取加密密码。

    然后,第一步将返回一个特定的值,客户端将其理解为“用户不存在”(例如:布尔值“False”)。

4

1 回答 1

5

我对您的方法的主要反对意见是您想让客户决定他是否经过身份验证。

不要那样做!

因为在这种情况下,任何恶意攻击者都可以始终声明自己已通过身份验证(基本上忽略服务器对第一次调用的响应),然后访问您的系统!

关于是否应该让敲门的客户的决定必须掌握在您手中- 例如,这是您绝对必须在后端/服务器端做的事情。

永远不要让客户做出这个决定!

于 2012-08-19T07:59:00.697 回答