首页logo
  •  

jonllen

金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。

个人档案

jonllen
心情闪存 | 给他留言
妮称:jonllen
来自:中国. 湖南. 湘潭
简述:金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。
博客日历

在WebService中使用Session或Cookie(实现Flex客户端身份验证)

分类:Asp.Net

     现在我们开发一个项目,业务逻辑层全部用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里面, 客户端不用管的,所以我就不希望还在客户端去写类似:System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer(); 然后在MyService.WebService service = new MyService.WebService();       service.CookieContainer = cookieContainer;为我的客户端不只是.net,还有Flex,甚至其他的,那它能有那个对象吗? 所以我就希望能就直接调用,我在WebService里面验证,验证通过就执行,验证不通过则不执行,但是当我想当然就这样做的时候,就出现了以上述的问题,我自认是菜鸟一个,想不到其他办法,现在又真的很急,所以请大家都帮帮忙,给我出出注意,请原谅我占了主页。

      补充一下:基本上我可以确认业务逻辑一定要写成WebService,因为我们经理说不止Flex下次我们的OA系统可能也要用WebServce,WebService能通用,所以就只能在WebService中写验证即用Session或Cookie验证了,整个解决办法如下:

      在WebService服务器端:

public HeaderContainer header;//申明一个SoapHeader
//登陆,成功之后暂返回用户实体里面的用户ID,然后在发送到客户端以标识用户,MemberItem为用户Model
[WebMethod(Description = "根据用户名密码返回用户详细信息,返回NULL则登陆失败!",EnableSession=true)]
[System.Xml.Serialization.XmlInclude(typeof(MemberItem))]
[SoapHeader("header", Direction = SoapHeaderDirection.Out)]
public MemberItem MemberLogin(string username, string password)
{
if (username.Equals(string.Empty) || password.Equals(string.Empty))
return null;
MemberItem item = MemberManager.MemberLogin(username, password);

header = new HeaderContainer();
if (item != null)
header.SessionID = item.Member_inner_code;
return item;
}
//修改密码,需要有才登陆后的唯一标识
[WebMethod(Description = "修改指定用户的密码,且要修改的用户为当前登陆的标识的用户.",EnableSession=true)]
[SoapHeader("header", Direction = SoapHeaderDirection.In)]
public bool MemberChangePwd(int memberID, string password)
{
if (password.Equals(string.Empty))
return false;

if (header != null)
{
if (header.SessionID == memberID)
{
MemberManager.MemberChangePwd(memberID, password);
return true;
}
else return false;
}
return false;
}

在.Net的客户端的调用:

MallMember m = new MallMember();//申明页面级全局WebService
//登陆
MemberItem item = m.MemberLogin("123", "123");
if (item != null)
{
Session["Member"] = m.HeaderContainerValue;//登陆成功在保存从服务器端发送过来的标识
}
else Response.Write("失败!");
//修改密码
MallMember.HeaderContainer header = (MallMember.HeaderContainer)Session["Member"];
m.HeaderContainerValue =header;//给SoapHead(里面包含有SessionID)赋值一起发送到服务器端去,服务器能接受并处理。
Response.Write(m.MemberChangePwd(123,"123"));

//Flex客户端调用
private var m:MallMember=new MallMember();//申明全局WebService
var h:HeaderContainer;//申明一个SoapHeader头
public function login():void{ m.addmemberLoginEventListener(loginHandler);
m.memberLogin('allen','aaaaaa');
}
//登陆判断,注意headers[0].content as HeaderContainer,因为他返回的数组,因为可能有多个SoapHeader,而我们就只用到一个而已
public function loginHandler(event:MemberLoginResultEvent):void{
if(event.result!=null){
h=event.headers[0].content as HeaderContainer;
Alert.show("登陆成功");
}
}
//为什么要传的是HeaderContainer0,而在去指定HeaderContainer,可能是因为它代理类的原因,添加WebService引用后自动生成的,
public function update():void{
if(h!=null){
var h0:HeaderContainer0=new HeaderContainer0();
h0.HeaderContainer=h;
m.addmemberChangePwdEventListener(updateHandler);
m.addmemberChangePwd_header(h0);
m.memberChangePwd(1,"mima");
}
}
更新事件
public function updateHandler(event:MemberChangePwdResultEvent):void{
if(event.result!=null){
Alert.show("更新成功"); }
}
//异常处理
public function fault(event:FaultEvent):void{ Alert.show("出现异常!"+event.fault.faultString);
}
标签:Asp.Net
  • posted@ 2008-06-02 11:10
  • update@ 2010-02-11 17:13:25
  • 阅读(15462)
  • 评论(0)

相关文章

评论
暂无任何评论。
发表评论
*必填
回复通知我
*必填

博文推荐