你的认证在服务器上应该还有session认证部分的。cookie只是附带一部分信息。sessionid是匹配客户端请求。
纯cookie验证是会被伪造的
微软自带项目里生成的都是附带了服务器session验证部分的。
他先生成一个验证票据存放起来,然后加密后放入cookies里返回客户端,使得下次用户在有效期里不需要重新登录。
你在后面那个站点的web.config中加个sessionState节点,配下cookieName
你上正式了做两个站点就没这个问题了
自己baidu了一下,大概摸情了原理,.net对认证cookie的加密会用到machinekey,machinekey 可以在web.config里配置,但一般不会去配置它, machinekey默认是自动生成的,每台机器都不一样,我本地的两个项目能共享认证信息是因为machinekey一样,所以我问题最下面的假设没有意义。。
不是,即使machinekey一样,也不行的。在同一个iis上部署两个网站。使用不同的域名。默认情况也不行的,不会互通的,因为cookie有作用域问题。
@心雨纷扬: session所使用的cookie有httponly的限制。
@心雨纷扬: 是的,我的两个本地的站点是localhost,域名一样,所以可以共享,域名不一样肯定不行
cookie有个域问题的。你cookie的domain是什么?cookie是可以共享的。
cookie的域问题我是知道的,所以我后面那个假设就是想通过改host文件生成模拟域名下的cookie,因为机器的machinekey不同,我就算是模似写入了cookie也没有意义
@danielduan: host文件生成模拟域名下的COOKIE,数据你服务器能认证通过?
你的COOKIE没有加密?跟本没有这方面的问题。
@盟怀部孩: 不是,我的意思是这样,假设www.abc.com下的网站也是.net网站,并且也是form认证,
我把www.abc.com改host为127.0.0.1,这样我再访问www.abc.com就是访问我本地的项目,我本地的项目也是form认证,我登录之后就是生成认证cookie了嘛,因为machinekey的问题,加密结果不一样,事实上也没有意义
@danielduan: 你最后还是把自己说服了,好样的。
@danielduan: 你担心这个,还不如担心,JS其实也可以写入COOKIE,现在的浏览器在开发者工具里就可以了写JS。
@danielduan: 但是你的本地服务器里并没有对应sessionid,所以也是没法通过的。
@心雨纷扬: sessionid也是COOKIE之一。你只要注意,COOKIE是可以复制的,就对了。
@盟怀部孩: 。。。。session是服务端验证的。。是我读书少了么。。。。
@心雨纷扬: 你上面写了sessionid了,服务器怎么知道你用的是哪个session?当然是通过sessionid这个cookie来识别。
@心雨纷扬: 比如这样,你登录了系统,然后系统给你SESSION和cookie,然后你可以复制这些cookie到别的浏览器里。
@盟怀部孩: 你说的然并卵。。。去其他浏览器是会产生新的sessionid的。
@心雨纷扬: 我可以用JS改掉他。
@心雨纷扬: 你想想。现在双核心浏览器里面的用户cookie是怎么共享的。那可是两个浏览器内核的之间切换
@盟怀部孩: 问题主人是想跨站点使用cookie伪造登录。
前面也有人说过了,目前form认证的cookie是httponly的,无法使用js简单操控。
还有就是最重要的,我们的问题是防止别人假冒登录,你已经登录成功了的sessionid,即便你能够弄到其他浏览器里使用,也不是别人假冒登录啊,是你自己折腾自己。
还有,我没有用双核心的浏览器, 你可以试试把博客园的登录信息在两个浏览器里同步看看,就是先在A浏览器里登录,然后你在B浏览器里先清空缓存,cookie,后再用你说的js折腾,看看能不能不输入用户名和密码登录进去。我没有试过,只是猜不行。
@心雨纷扬: 你只要了解服务器是怎么区别一个用户的唯一标识的就可以了。web端是获取不到唯一标识,就算取到了,也是可以修改的。