WCF用户身份验证最佳实践

Hus*_*lil 1 .net c# wcf

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

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

我的问题:

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

    这是可接受的行为吗?

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

    1)确保用户存在.

    2)从DB中获取加密密码.

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

mar*_*c_s 5

我对你的方法的主要反对意见是你想让客户做出关于他是否经过身份验证的决定.

不要那样做!

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

关于是否应该允许客户敲门的决定必须留在您手中 - 例如,您必须在后端/服务器端执行此操作.

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