随笔 - 6, 文章 - 1, 评论 - 135, 引用 - 0
数据加载中……

急!急!!急!!!求解如何在WebService中使用Session或Cookie---WebService安全策略

     现在我们开发一个项目,业务逻辑层全部用WebService,客户端有Flex和Asp.Net,Flex和Asp.Net的所有业务逻辑数据库的访问全部调用WebService中的方法(好象Flex也不能直接对数据库进行访问,所以也只能用WebService),现在就出现问题了,就是WebService中的权限问题了,比如:我在WebService中有一个Login的方法,还有一个ChangePwd修改用户密码的方法,可之,如果我要调用ChangePwd方法前我一定要判断用户是否Login了,所以一般的情况就是在Login方法里面当用户成功登陆后就Sesssion用户ID或者是用Cookie来保存以唯一标识用户,然后我再在ChangePwd方法里面先判断访问的用户是否存在Session或是有Cookie标识,如果有的话我再允许修改修改他自己当前登陆的密码,但是这些当做为WebService方法的提供的时候就出现了问题,我在访问用户成功Login后Session当前用户的ID之后,当用户再去调用ChangePwd方法的时候Session却丢失了,原因是我并不是直接打开IE访问WebService页面,然后在点调用那一个WebService方法,那样我能成功验证。但我现在要是在我的项目中添加WebService引用,引用成功后.net便会自动生成一个App_WebReferences文件夹来保存引用的WebService的WSDL等信息,我们在调用的时候将WebService实例化后就直接调用Login或ChangePwd方法了,但是我是这样调用的话当我成功Login后能Session一个用户ID,但是当我在调用ChangePwd后却不能成功,因为我在ChangePwd是判断了Session是否存在,结果Session不存在了,我明明在成功Login后Session了用户ID但是却在第二次调用ChangePwd的时候不存在了,郁闷…我用Coookie亦如此,也丢失了,测试可知,我打开页面直接访问WebService中调用他的方法能成功,能植入Cookie,但我添加WebService引用到项目在调用Login方法时候根本就没法值入Cookie,没有报错,但是我在网页临时文件夹和Cookie的文件夹内都找不到Cookie,第二次在调用ChangePwd时我在判断身份时候当然也是个Cookie不存在。
     在网上看了很多Cookie和Session的东西,在WebService中能应用的没几个,有人说要在客户端写个CookieContainer的Cookie容器来保存WebService传回来的一些Cookie那样便不会丢失,但是有一个非常严重的问题就是我的客户端还必须是Flex,如果只是在.Net中调用那当然没事,我在.net中就直接判断Session或Cookie很方便的,也不存在丢失的问题,就根本不需要的在WebService里面去判断权限了,但是我WebService的客户端还必须是Flex,Flex它好象不能做权限处理的,数据库也不能直接访问,所以便要调用WebService,所有我便想把权限处理放在WebService里面,客户端不用管的,就直接调用,我在WebService里面验证,验证通过就执行,验证不通过则不执行,但是当我想当然就这样做的时候,就出现了上述的问题,我真的很急,因为我刚进公司,然后公司里面要赶项目,做一个电子商务的网站,要做一个Asp.net版的和一个Flex版的,所有业务逻辑全调用WebService,而我负责写WebService,一开始就遇到了这个头疼的问题,所以请各位高手帮我想想办法,我自认是菜鸟一个,想不到其他办法,现在又真的很急,所以请大家都帮帮忙,给我出出注意,请原谅我占了主页。

补充一下:基本上我可以确认业务逻辑一定要写成WebService,因为我们经理说不止Flex下次我们的OA系统可能也要用WebServce,WebService能通用,所以就只能在WebService中写验证即用Session或Cookie验证了,请大家在这里帮我想想办法解决。谢谢!!!(如果大家愿意帮我忙话要测试的话可以留言问我要测试WebService,我已经把我写的几个WebService挂到了网上)

posted on 2008-06-01 19:37 Jonllen Peng 阅读(1364) 评论(14)  编辑 收藏

评论

#1楼    回复  引用    

WSE
2008-06-01 19:42 | RTest [未注册用户]

#2楼    回复  引用    

看不清楚你写的,乱七八糟

#3楼    回复  引用  查看    

[WebMethod(EnableSession=true)]
2008-06-01 19:59 | Scott Xu(南方小鬼)      

#4楼    回复  引用    

我觉得把session作为webservice调用的flag应该也可以解决这个问题,进攻参参考。:)
2008-06-01 20:03 | laper [未注册用户]

#5楼 [楼主]   回复  引用  查看    

@Scott Xu(南方小鬼)
EnableSession=true那个我早就写了啊,只要要用到Session的WebService里面我都写了的,不然你用Session的时候就会报错了。仍然谢谢!
2008-06-01 20:31 | Jonllen Peng      

#6楼 [楼主]   回复  引用  查看    

@laper
恕我愚钝,'把session作为webservice调用的flag'什么意思,能不能具体一点。
2008-06-01 20:35 | Jonllen Peng      

#7楼    回复  引用  查看    

写这方面的经验比较少,但是能不能要求Flex每次发送请求的时候在参数里面附加一个SessionID呢,而SessionID由你的程序产生,例如GUID,基本原理就是你自己重新实现一个Session。
2008-06-01 20:37 | killkill      

#8楼 [楼主]   回复  引用  查看    

@killkill
这个我曾经考虑过,你的意思是不是当我成功Login后传回到客户端一个参数,这个参数就是自己产生的一个SessionID,然后当我再调用ChangePwd方法的时候把这个SessionID传回来,就能够标识了,你是不是这个意思?但是我WebService里面有好多方法,用到增、删、改和后台基本上都要用到权限判断,那我乞不是在调用的每个方法里面都要加一个保存SessionID的参数?
请问你知道Flex会不会接收到Asp.Net中产生的Session对象,如果能的话当前还可以解决问题,好象可以用,不过Flex好象产生的swf文件和as脚本都在客户端生成,无所谓服务器,那Session怎么用?但是最好还是能在WebService中做权限验证为好,不然那别人调用我的WebService就直接操作那还有什么安全可言。
2008-06-01 21:09 | Jonllen Peng      

#9楼    回复  引用  查看    

所谓Session的实现,据我见过的WebAPP都是由客户端回传一个SessionID的,这个SessionID存在于Cookie中,并不会附带任何数据,当然不会有非常“强大”的Session对象了。
Session的数据是存在于服务器端,客户端仅仅保存一个SessionID。
如果通过抓包分析的话,即使原始的Cookie纪录的SessionID也是可以得到,并可被第三方窃取的,所以我个人认为,手动实现Session和自动Session的安全性应该是同级的。
手动实现的副作用就是你每个WS方法都要多个参数了。
我的方案是这样的,在服务器端维护一个这样的数据结构
假设SessionID为GUID
Dictionary<Guid,Dictionary<string,object>> Sessions
登陆后 Sessions.Add<SessionID,new Dictionary<string,object>())
判断是否登陆就 Sessions.ContainsKey(SessionID);
用某个Session["key"]就这样 Sessions[SessionID]["key"]
当然Session的超时,LZ还是要想办法的 :)
虽然显得很笨拙,但是按照LZ描述的情况来看,笨拙点应该是可以接受的 :>
2008-06-01 21:29 | killkill      

#10楼 [楼主]   回复  引用  查看    

@killkill
谢谢!非常感谢再次回帖,但是我觉得还是那个问题,如果要我在每个WebService方法里面多加一个保存SessionID的参数的话,感觉太麻烦了,如果我每个都加一个参数的话,那可能又会出现一些问题了,比如我Login成功后我是返回一个用户的Model的,登陆失败的话则返回NULL,成功就返回的Model里面包含了用户的一些字段信息,那我返回的SessionID那又如何传回?我个每一个WebService都有返回值的,难道我在参数里面多加一个ref或out类型的参数,那在WebService中又是怎么样的,目前还没有测试行不行,又如果用了参数返回了SessionID,那我客户端不也要申明一个全局变量来保存SessionID?麻烦!,而且我不知道new Dictionary<string,object>())你那样能不能实现持久?我的基本功不怎么杂实,如果我再次回调时候Dictionary里面还会有没有object,还没有测试过。
不过我好象想到了一个办法,就是说还是用Session保存对象,只不过在Web.Config文件内配置SessionState为一个保存在数据里面的模式,好象有这个中模式,不知道行不行?但是可能还是存在有同样的问题?
2008-06-01 22:29 | Jonllen Peng      

#11楼    回复  引用    

http://www.cnblogs.com/chinadhf/archive/2006/10/08/520975.html
2008-06-02 07:52 | Guest [未注册用户]

#12楼    回复  引用  查看    

楼上正解。
2008-06-02 08:23 | 一味      

#13楼    回复  引用  查看    

@Jonllen Peng
实现Dictionary....., 很容易,放在一个Singleton实例就是了 。
SessionID只是在Login后给客户端,由客户端保存
每次发送请求,附带就可以
2008-06-02 10:29 | killkill      

#14楼    回复  引用    

Forget web service.

If you are using .Net as your application tier. FluorineFX is a good choice.

At least you can call your assembly directly.

Open source and there are lot's of samples in your installed folder.

BTW.
If you use Flex as your font tool. Why do you need 如果我要调用ChangePwd方法前我一定要判断用户是否Login了? After user login, you can just create a varible to remeber the user has login or not. Right?
Usually I use UserId to be the flag.

2008-06-03 01:50 | WG [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-02 11:11 编辑过


相关链接: