我正在编写一个使用 WCF 与 Web 服务通信的应用程序。数据库还用于存储与用户相关的数据,例如凭据。数据库中的密码是散列+加盐的。
用户必须使用提供给他的用户名和密码手动登录。然后,应用程序使用代理与负责身份验证的 Web 服务进行通信。Web 服务然后检查用户是否存在并将数据返回给客户端,然后客户端显示数据。否则,如果凭据无效或服务器无法访问,则会显示错误。
我的问题:
为了减少 Web 服务完成的工作量,我希望由客户端完成身份验证过程。换句话说,客户端将用户名发送到 Web 服务,然后 Web 服务检查数据库中是否存在“用户”表中该用户名的条目。如果是,Web 服务将散列和加盐的密码(来自数据库)返回给客户端。然后客户端将用户输入的密码与获得的哈希/加盐密码进行比较。没有解密,输入的密码只是使用相同的盐字节进行哈希处理,然后比较密码。
这是可以接受的行为吗?
如果在数据库中找不到提供的用户名,我应该如何处理?服务器是否应该抛出异常,然后由客户端处理?或者我应该将身份验证部分分为两个步骤:
1)确保用户存在。
2)从数据库中获取加密密码。
然后,第一步将返回一个特定的值,客户端将其理解为“用户不存在”(例如:布尔值“False”)。