WCF用户身份验证最佳实践

时间:2012-08-19 07:43:51

标签: c# .net wcf

我正在编写一个使用WCF以便与Web服务进行通信的应用程序。数据库还用于存储与用户相关的数据,例如凭证。数据库中的密码是哈希+盐渍的。

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

我的问题:

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

    这是可接受的行为吗?

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

    1)确保用户存在。

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

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

1 个答案:

答案 0 :(得分:5)

我的主要异议对您的方法是,您希望让客户决定是否进行身份验证。

不要这样做!

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

关于是否应该允许客户敲门的决定必须保留在您手中 - 例如这是你在后端/服务器端绝对必须做的事情。

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