前言你现在要搭建一个系统。无论系统的功能如何,用户认证都是一项始终存在的功能。实现起来似乎应该很简单——只需“拖”一些现成的认证模块,或者配置一些基本选项(比如SpringSecurity),就大功告成了。是这样吗,不是。以上是粗浅的描述(比如你要实现一个搜索引擎,只需要一个输入框和一个搜索按钮??),要实现正确识别是极其复杂的。不仅仅是登录表单->检查用户名/密码->设置cookie,还有很多其他问题需要考虑:cookie安全性如何确保cookie不会被泄露或伪造。你是使用cookies,还是使用像JWT这样的无状态方法,使用SameSite宽松还是严格要求?绑定IP如果IP改变,将cookie绑定到IP并注销用户?密码要求最小长度,特殊字符?帮助选择密码用户界面?密码存储在数据库中存储密码-bcrypt、scrypt、PBKDF2、SHA多次迭代?免密登录允许在浏览器中存储,一般是“是”,但某些应用程序在发送Handle之前故意对其进行哈希处理,使其无法自动存储帐户样式的电子邮件、用户名和电话号码-您需要用户名吗?允许更改电子邮件、电话号码?限制登录错误限制身份验证尝试-应阻止多少次登录失败的帐户,应通知管理员多长时间或至少记录锁定的帐户?每个IP、每个帐户的限制是这些的组合吗?验证码你需要验证码吗?哪些是允许尝试的?刷新验证码是一个选项吗?密码重置密码重置令牌数据库表或到HMAC的过期链接?限制密码重置?SSO您的服务是否应该支持LDAP/ActiveDirectory身份验证(可能),是否应该支持SAML2.0或OpenIDConnect,如果支持,支持哪些?还是全部?它应该只支持SSO,而不支持内部身份验证吗?2FA–TOTP实现了整个2FA(双因素身份验证)过程,包括启用/禁用,或备份代码;添加选项在一段时间内不为特定设备请求2FA?配置AD/LDAP用户子集以根据某些组成员资格进行身份验证?强制执行2FA由管理员配置强制2FA–启用全局选项时实施后激活2FA的时间窗口?一次性登录通过链接登录–是否可以选择通过电子邮件发送一次性登录链接?XSS保护确保没有XSS漏洞,尤其是在登录页面上(XSS可以窃取cookie)身份验证日志私人身份验证日志-能够保留所有登录的历史记录,包括时间、IP、用户代理如果登录需要注销,则强制注销设备。允许移动设备保持登录状态是否让移动设备保持登录状态——客户端应该存储什么?(当然不是明文密码)保存用户的登录地址捕获用户的登录时区并将其存储在会话中以调整UI中的时间?TLS相互认证如果我们需要支持使用私钥进行令牌认证,我们应该启用TLS相互认证。证书库中应该包含什么,Web服务器是否支持每页相互TLS或我们是否应该使用子域,如果有负载平衡器/反向代理,它是否支持它以及如何转发证书详细信息?是否需要一个激活步骤来激活账户或者让用户在注册后立即登录?要求后台人员批准账户?初始密码设置管理员创建的帐户的初始密码设置-生成初始密码并在首次登录时强制更改?不生成密码并开始密码重置过程?登录异常检测如何检测登录异常,如何通知用户?您是否依赖第三方工具(如SIEM)或内置此类功能?身份验证是每个应用程序的基本功能。但是很多开发者或者PM并不重视。IT世界很复杂,没有什么是简单的。发送电子邮件不简单,身份验证不简单,登录也不简单。处理字符串和日期并非易事,净化输入和输出也并非易事。我们在构建框架和工具来帮助我们完成所有这些事情方面做得还不够好。我们应该积极应对这些问题,认真思考,做出最正确的解决方案。
