一、安全的身份验证原理
在用户每次访问站点的时候,为了方便的记住用户之前的某些操作,引入Session机制,为用户在内存中分配一个存储空间,同时标识该Session对象(生成唯一标识符),以及将该标识写入客户端Cookie中。这样每次用户访问页面的时候会将Cookie中的该标识发送到服务端,服务端取出来自客户端的Session标识找到内存中对应的Session对象即可知道该用户对应的内存存储区域以及其保存的数据。
上面这个标识只是为了跟踪用户的会话,但用户登录站点后,表示他已经具有某些特殊的权限,为了合法访问某些特殊权限页面,我们需要在通过登录验证的用户标识给他一个“身份验证票证”,其类似于Session标识。将这个票证写入客户端Cookie中,以后用户每次 访问特殊权限页面,应用程序都会取出这个票证,和服务端对比,看是否一致,以便决定其是否有权限访问该页面。
身份验证票证在服务端可以存储在该用户的Session对象中(内存中查找高效)。在 客户端可以存储在Cookie中,也可以 存储在表单中的某个隐藏字段。
因为这种验证方式用户需要提供两个证件来证明自己的身份,所以顾名思义,我且称他为“双证模式”。
二、asp.net实现
asp.net默认开启 为 每位访问者分配产生一个Session对象帮助用户记住之前在站点操作过的重要数据,可以在浏览器Cookie产看中看到(如图1在火狐中查看到 的ASP.NET_SessionId).在用户登录后通过编程方式将“身份验证票证”也添加到客户端Cookie中(如图2在火狐中查看到的.ASPXAUTH)。
实现代码:
下面提供了两个页面,一个登录页和一个登录验证成功后的管理员页。当首次访问登录页的时候会自动产生Session标识到Cookie中,当通过用户名密码验证后将产生“身份验证票证”标识到Cookie中。
三、安全性
Session标识可以使用简单的GUID就可以了,但“身份验证票证”视安全级别而定,级别越高需要产生更加冗长、更加不易被“暴力”破解的密文。但这种安全验证也有缺点就是如果站点受到跨站点脚本攻击,那么黑客就可以轻易的获取到受害者的这两个标识,从而劫持会话!
产生“身份验证票证”标识时,不能在算法中加入用户机密信息,如用户名和密码等。以防黑客解密票证后,可以看到用户的登录密码,从而长期彻底占有账户。
如果想更安全一点,防御跨站点脚本攻击,可以在Session或票证中加入一些合法用户的浏览器信息、对方的IP地址等。这样我们可以在服务端验证访客的合法性等等你能想到的更多措施来加强防范此类攻击。