新足迹

 找回密码
 注册

精华好帖回顾

· 大头家常菜 -- 韩国石锅拌饭,烤五花肉,炒粉丝 (2008-7-6) datou2z · 我行我歌--春节短登小记 (2005-2-24) 梧桐叶
· 我们不准备花钱让孩子上私校 (首楼更新: 准备花钱送孩子上私校10/12/13) (2007-4-9) 飞儿 · 沿河西走廊,走一段丝绸之路 (兰州 – 张掖 – 敦煌 2024年6月游记) (2024-7-2) GG
Advertisement
Advertisement
楼主:dalaohu

多重登录问题 [复制链接]

发表于 2011-5-31 12:07 |显示全部楼层

回复 pop3 29# 帖子

此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不管你打开几个tab,它们与同一个domain之间共享一个session。
你打开tab 1,用账户A登录gmail,不logout,打开tab 2,访问google,发现你已经是用户A了,
你logout,再回到tab 1,点任何链接,你已经logout了。你再切换到tab 2, 用B登录,再回到tab 1,
点任何连接,你已经是B了。你再打开tab 3, 访问google,这时候你是B
明白了吧?

评分

参与人数 1积分 +2 收起 理由
乱码 + 2 我很赞同

查看全部评分

Advertisement
Advertisement

发表于 2011-5-31 12:11 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2011-5-31 12:00 发表
我觉得把uniqueid放在url和session里面是可行的,根据这个uniqueid来判断用户是谁,是否登录
比如userid是2000,运行xxx?userid=2000,如果SESSION['user_2000']=true,就可以继续,不行就让user登录,然后更新session.

但我觉得这个功能真的是无聊透顶了,我是死都不会做的


这么写在browser这边一定要disable cookie的。不然SESSION['user_2000']不会检查url。

最彻底的方式就是全部state都在url上,任何对state的判断都parse url的东西,而不用framework,也不用pass tab id过去(这真挺难的,要对browser/http编程),这样基本上就可以符合要求,但基本上也没什么安全性可言了。

不过这种approach对framework要求也低,classic asp就能搞定。

发表于 2011-5-31 12:13 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 porcorosso 于 2011-5-31 10:50 发表
webserver 的 session handler 行不通的

自己写个custom session handler就可以。不难的,用unique id。

uniqueid 在url或form都行

但是clusted webserver就困难了。




白条。


不推荐大老虎(双胸一)用.net自带的session class,不知道能不能100%实现先是一个问题,就算弄出来了,你还要在不同的IIS版本(server)和Browser(client)下测试。


你自己写一个类似于session功能的class和methods。一些几十年前写的windows app就是这样实现session的:


一个[Session] table,带session_id(PK,incremental), user_id(FK), session_starttime, session_endtime, session_lasttime, etc.


1, 当大老虎(双胸一) 登陆,插入一个新session record,连到[user] table, starttime和lasttime = current time, endtime keeps NULL;
2,当乱码(双胸二)登陆,插入一个新session record,连到[user] table, starttime和lasttime = current time, endtime keeps NULL;
3, 当大老虎(双胸一)进行任何操作,update his session record, set lasttime = current time。 -- 你可以之前比较2个时间,自定义session expiry time,然后决定要不要user重新登陆;
4, 当大老虎(双胸一)登出,update his session record, set endtime = current time --- 这样系统就知道一位用户如果有NULL-value的 session endtime record,那么ta是在线的。
5,可能会遇到用户在进程里面关闭app或者browserer而非正常退出。这也OK,如果ta再次登陆,set endtime of 1st record & create a new one with NULL endtime。这样,不管对方是什么浏览器或者tab,只要有异地重复登陆,前一个session就让它作废。


session_id可以通过URL或者viewstate加密传递,page load之时先check session id 是否已经作废 (endtime != NULL) 再做操作。

[ 本帖最后由 BJ-KING 于 2011-5-31 12:15 编辑 ]

发表于 2011-5-31 12:15 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2011-5-31 12:00 发表
我觉得把uniqueid放在url和session里面是可行的,根据这个uniqueid来判断用户是谁,是否登录
比如userid是2000,运行xxx?userid=2000,如果SESSION['user_2000']=true,就可以继续,不行就让user登录,然后更新session.

但我觉得这个功能真的是无聊透顶了,我是死都不会做的


问题是这个unique id怎样生成?
当用户打开一个新tab,发出请求,server必须在此时生成一个unique id,问题是server怎样知道这个请求来自原来的tab还是新开的tab?

session的工作原理是当浏览器第一次发出请求时,server检查请求里是否有session cookie或session id,如果没有则创建session,并把session id放在cookie或http header里连同响应一起送回给浏览器,在以后的每次交互中,这个session id无论是通过url还是cookie都是在浏览器和服务器间传来传去,直到用户logout或浏览器关闭。

发表于 2011-5-31 12:28 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我来用实例说明,大家就知道这在现在的浏览器里是不可能实现的。
我打开浏览器,在地址栏输入www.google.com,默认tab打开google页面,我登陆。
然后,
Case 1, 新开一个tab,在地址栏输入www.google.com,回车
Case 2, 不打开新tab,在地址栏输入www.google.com,回车
注意,这两种情况下,浏览器向google服务器发出的http请求是完完全全一样的,
所以不管你在server端怎么折腾,你都无法辨认这是一个新用户发出的请求还是已登录用户发出的请求。

发表于 2011-5-31 12:30 |显示全部楼层

回复 fyang1024 35# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
白条!
Advertisement
Advertisement

发表于 2011-5-31 12:33 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 fyang1024 于 2011-5-31 12:28 发表
我来用实例说明,大家就知道这在现在的浏览器里是不可能实现的。
我打开浏览器,在地址栏输入www.google.com,默认tab打开google页面,我登陆。
然后,
Case 1, 新开一个tab,在地址栏输入www.google.com,回车
Case 2, 不打开新tab, ...


如果你把所有的state都放在url上,就可以了,server logic都要改成是根据url来做的。

发表于 2011-5-31 12:38 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-5-31 12:33 发表


如果你把所有的state都放在url上,就可以了,server logic都要改成是根据url来做的。


你这个state是基于什么产生的?
用户打开新tab,用什么URL是用户说了算,难道他非要把state放在url才能访问你的网站?他怎么知道放什么state在URL里?
把同一个东西放在塑料袋里还是纸袋里不会改变你要送的东西
不妨你试着实现一下,看看是不是如你所想

[ 本帖最后由 fyang1024 于 2011-5-31 12:41 编辑 ]

发表于 2011-5-31 12:40 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 fyang1024 于 2011-5-31 12:38 发表


你这个state是基于什么产生的?
把同一个东西放在塑料袋里还是纸袋里不会改变你要送的东西
不妨你试着实现一下,看看是不是如你所想


用户打开新tab,用什么URL是用户说了算,难道他非要把state放在url才能访问你的网站?他怎么知道放什么state在URL里?
--这一定不是public website,不然早被人黑了。
--除了homepage之外,所有的url,server那边的logic都可以操纵。
--返回的url,user state是object serialize一下手动加上去的,不用任何framework的state mechanism. session什么的都不用.
--可能用些301/302,performance就不考虑了。
--读取state是个逆过程,deserialize一下.

[ 本帖最后由 乱码 于 2011-5-31 12:45 编辑 ]

发表于 2011-5-31 12:49 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-5-31 12:40 发表


state是object serialize一下手动加上去的,不用任何framework的state mechanism. session什么的都不用.

读取是个逆过程,deserialize一下.


我明白你的意思了,你是想用request paratemer来识别一个用户,所有的request都必须有那个request parameter。那用户只要改一下URL或Form就可以改用户了.

用这种方案,当用户登录google后,用户必须被重定向到www.google.com?state=blah
只要用户胆敢把?state=blah去掉,用户就被logout了

特殊贡献奖章

发表于 2011-5-31 12:53 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
是啊,就是这样
只是方便操作,assume用户知道自己在干嘛
反正一台电脑也是只一个人用,登录了3个人就可以有3个人的权限
原帖由 fyang1024 于 2011-5-31 12:49 发表


我明白你的意思了,你是想用request paratemer来识别一个用户,所有的request都必须有那个request parameter。那用户只要改一下URL或Form就可以改用户了.

用这种方案,当用户登录google后,用户必须被重定向到www.google.com?state=blah
只要用户胆敢把?state=blah去掉,用户就被logout了
Advertisement
Advertisement

发表于 2011-5-31 12:59 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2011-5-31 12:53 发表
是啊,就是这样
只是方便操作,assume用户知道自己在干嘛
反正一台电脑也是只一个人用,登录了3个人就可以有3个人的权限


介就是个hack而已阿,8能作为正式应用的

评分

参与人数 1积分 +2 收起 理由
kr2000 + 2 所以我一定不做

查看全部评分

发表于 2011-5-31 13:04 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
胸弟们,我们能不能回到大老虎原来的问题


假设他不考虑安全性的问题,是不是URL + querystring 是目前解决他问题最好的办法。

都同意吗?

发表于 2011-5-31 13:10 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果登录功能不考虑安全问题,咋样都行阿。
如果LZ一开始说明这一点,大家也就不用这么费劲了。
俺就直接建议加个?user=小张,小张就直接登录了

发表于 2011-5-31 13:52 |显示全部楼层
此文章由 EE1 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 EE1 所有!转贴必须注明作者、出处和本声明,并保持内容完整
把session id 放在url里面就可以了,登陆成功的时候由server生成unique id,client每次请求的时候把这个 id 带上
缺点是不安全,以前这么做被客户投诉,后来自己弄个算法,每次请求在client side以unique id为seed简单的随机加密一下就 ok了

发表于 2011-5-31 14:02 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 fyang1024 于 2011-5-31 12:49 发表


我明白你的意思了,你是想用request paratemer来识别一个用户,所有的request都必须有那个request parameter。那用户只要改一下URL或Form就可以改用户了.

用这种方案,当用户登录google后,用户必须被重定向到www.google.com?state=blah
只要用户胆敢把?state=blah去掉,用户就被logout了


是啊,我就是这个意思,把persist state的工作都做在url的明处,这个要求是实现了,不过也基本上没人用了。

相信asp.net framework在探测到browser disable cookie之后也是做类似的事情,不过他们用安全性很好的加密/解密,其他人即使拿到parameter之后也不知道怎么处理。

一样的意思。

[ 本帖最后由 乱码 于 2011-5-31 14:07 编辑 ]
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-5-31 14:08 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
cookieless session

<sessionState cookieless="true" />

大家说行不行? cookieless 就是吧sessionid embed再url里。 state完全有url来决定。
。net framework本身也支持,不用写额外得code。 我感觉好像新得tab里login另一个id应该不影响其他得tab。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-5-31 14:11 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 BJ-KING 于 2011-5-31 13:04 发表
胸弟们,我们能不能回到大老虎原来的问题


假设他不考虑安全性的问题,是不是URL + querystring 是目前解决他问题最好的办法。

都同意吗?


可以用viewstate,但这不夸平台,是asp.net的东西,安全性好点。

或者用hidden field也行.

发表于 2011-5-31 14:14 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2011-5-31 14:08 发表
cookieless session



大家说行不行? cookieless 就是吧sessionid embed再url里。 state完全有url来决定。
。net framework本身也支持,不用写额外得code。 我感觉好像新得tab里login另一个id应该不影响其他得tab。


如果你disable cookie,asp.net自动到url里面找你session的东西,你还是不能实现每个tab有自己的session。

到url解析session的工作,你必须要自己做。

发表于 2011-5-31 14:23 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
让我们系统的考虑一下:


server side maintain state先出局,不考虑。


client side maintain state就几个途径,就排除法就成:

View state -- OK

Control state -- out of scope

Hidden fields -- Ok

Cookies -- not valid

Query strings -- OK

就从viewstate/hidden field/query string上考虑就好了,实现起来viewstate可能用asp.net作轻松点。 其他两个不安全,也费劲,

发表于 2011-5-31 14:43 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
用自己做的session class应该可以实现
但是每个新tab必须login 再加上
每个用户只能同时有一个连接
或者每打开一个页面都需要login,即使是同一tab中
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-5-31 14:58 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我简单的试了一下。 Cookieless session 可以满足要求。code change也是mimium的。

在2个tab上分别以两个不同的user登录。 可以同时操作,互补影响。
新开一个tab,就是未登录状态。

当然这个在MVC下就不行了 (默认设置下),因为url里embed有sessionid。
吧route map用regex 设一下,应该也可以工作。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

2010年度奖章获得者

发表于 2011-5-31 15:06 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
ls有人说hidden field/viewstate,我想应该不行的。如果没有postback起不是废掉了。
而且这个viewstate 局限于webform,不过generic

发表于 2011-5-31 15:15 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2011-5-31 15:06 发表
ls有人说hidden field/viewstate,我想应该不行的。如果没有postback起不是废掉了。
而且这个viewstate 局限于webform,不过generic


如果用request parameter(如sessionid)可以,hidden field也一定可以,两者没有本质区别,一个放在URL里,一个放在表单里

2010年度奖章获得者

发表于 2011-5-31 15:21 |显示全部楼层

回复 fyang1024 54# 帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本质上当然有区别。
在url 上属于httpcontext,可以设个global request handler,自动把url id,attach到新的request上去。
hidden field/viewstate 没有postback的话,根本无法全球处理。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-5-31 15:25 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2011-5-31 15:21 发表
本质上当然有区别。
在url 上属于httpcontext,可以设个global request handler,自动把url id,attach到新的request上去。
hidden field/viewstate 没有postback的话,根本无法全球处理。


hidden field在get方式下就会变成request parameter,这个工作是浏览器自己完成的
无论怎样,服务器是可以拿到那个hidden field的值的
Advertisement
Advertisement

发表于 2011-5-31 15:26 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2011-5-31 15:06 发表
ls有人说hidden field/viewstate,我想应该不行的。如果没有postback起不是废掉了。
而且这个viewstate 局限于webform,不过generic




左胸啊,每个solution本来就都有优势和劣势的啦。


用session的话,如果你的web app最终deploy在multiple web servers的话(譬如同时访问的人会上万;用load balancer),session object 也不工作了。(当然有另外的解决办法)


具体还是要看你和客户最终的要求和实现。

2010年度奖章获得者

发表于 2011-5-31 15:30 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 fyang1024 于 2011-5-31 15:25 发表


hidden field在get方式下就会变成request parameter,这个工作是浏览器自己完成的
无论怎样,服务器是可以拿到那个hidden field的值的


get/post 都需要一个postback,才能到服务器啊。

如果用户只是点一个hyperlink,到下一页呢?
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-5-31 15:33 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
太.net了,没办法沟通

发表于 2011-5-31 15:49 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2011-5-31 15:30 发表


get/post 都需要一个postback,才能到服务器啊。

如果用户只是点一个hyperlink,到下一页呢?


postback对应http post method,hidden field(包括viewstate)会post回server.

asp.net没有任何名次对应http get method,是个空的request,form中的全部东西都不pass回server.

嗯,如果不想写javascript的话,就不要用hidden field/viewstate了,全用url吧

[ 本帖最后由 乱码 于 2011-5-31 15:54 编辑 ]

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部