FormsAuthentication是ASP.NET运行时提供的一种Web身份验证方案,以cookie为信息载体,同其它身份验证方案相比,此方案广泛应用于各类的Web应用中,其实现原理其实和具体的Web服务器编程技术关系不大,理解FormsAuthentication,同样可以在Java或PHP中使用。
FormsAuthenticationTicket其实是一个cookie,多数封装的操作也是从cookie使用的角度去实现的。出于业务的需求,我们会在通过身份认证的浏览器写入用户有关的信息,用户信息结合cookie属性可以构成基本的票据,票据是下次用户请求时认证和授权的依据。这是非常简便的思路,但如果这个依据是公开的、可构造的,那么这个票据的意义将大打折扣。通过构造票据就可以达到躲避认证、伪造身份和授权的目的,这对于应用而言非常危险。
众所周知,网络通信的信道是非安全的公共网络。对于信息需要保护的系统,认证的过程和认证后的票据应该处于被保护的状态。首先,票据应该是加密的,加密虽然增加了读取票据是额外的解密运算,但增加了掌握票据内容的难度。FormsAuthentication的提供的Encrypt方法加密存储在浏览器的票据cookie,这可以说是APS.NET的一个安全福利。然而如前所说,加密仅仅是增加了掌握票据内容的难度,如果某人利用别人的合法认证票据,应用系统无法基于票据规避身份盗用的情况。
cookie重放,或是票据盗用是Web安全中经常出现的身份冒用攻击。这种攻击方法不需要对cookie进行逆向理解,只要将获取的用户cookie注入浏览器中,就可以以该用户的身份访问目标站点,非法获取网络资源。目前国内多数微博服务、邮件服务都有这样的情况。
那么这样的情况能否规避。通常我们的系统在业务设计时,总会信赖自己写入票据的内容,判别身份时也仅仅读取身份标识,就任务当前的操作由对应用户发出。这个非常要命的单因子判定是产生身份冒用的一个根源,解决的办法就是在用户信息中输入更多的认证时的网络情况,如浏览器的IP、特征等信息,甚至包括有服务器生成的唯一字符,在后续的再认证中在业务流程前加入额外信息的校验。双因子认证,利用当时的环境信息作为安全认证的重要内容,可以在一定程度上增加系统的安全度。