如何编写需要授权才能使用的WebService?
2008-08-13 17:31
225 查看
接触WebService没多久,一个令我困扰的问题就是怎么样给自己开发的WebService加上身份认证的功能,因为我不想什么乱七八糟的人使用我的服务,因为这个WebService可能存在一些有关个人隐私的信息,除了授权的人之外,闲杂人等一律要拒之门外。这个对于Windows应用程序来说易如反掌的功能在WebService上应该如何实现呢?
具体如何实现者一功能有许多方法,在CodeGuru的Build Secure Web Services With SOAP Headers and Extensions
http://www.codeguru.com/Csharp/Csharp/cs_webservices/security/article.php/c5479/
文章中使用了一种不错的方法,可以大体上解决我的问题,但是在Quotes2实现里每次都需要验证一次用户名和密码,而Quote3实现的方法假如使用HTTP GET和HTTP POST好像又会失效,总是感觉美中不足,有没有一种方法可以对WebService的任何调用方式都有效呢?经过多方查找资料,终于找到一个可行的方法:利用Session。假如你编写过Web应用程序的话,对于Session肯定不陌生,对于需要保持状态的程序而言,Session和Application是必不可少的,比如那些论坛和留言版等等。我们这里就要利用相同的机制实现用户认证。
首先我给WebService添加一个名为Login的方法:
![](http://www.chenjiliang.com/Image/Extension/cs.ico)
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
这里仅仅是一个示例,因此我简化了用户的认证过程,Login方法很简单,它所作的工作就是在用户身份验证通过之后将Session["login"]置为1表示用户通过验证,否则返回"login failed"的错误信息。这里的实现和一般的WebMethod没有什么区别,除了多了一个属性EnableSession = true之外。这是我们实现认证功能的关键所在,在这个WebService中,所有的方法都必须使用这个属性加以标记。
好了,服务器端的工作就查不多了(这么简单,不可思议吧),为了检验我们这个方法是否有效,我们再添加一个方法验证一下:
![](http://www.chenjiliang.com/Image/Extension/cs.ico)
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
现在我们来编写一个客户端验证一下到底这个方法是否有效,新建一个控制台程序TestCon,添加这个程序的Web引用,并把引用文件夹重命名为login,编写如下代码:
![](http://www.chenjiliang.com/Image/Extension/cs.ico)
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
Ctrl+F5运行程序,程序运行结果如下:
![](http://www.chenjiliang.com/Article/ArticleImage/85/1297/WebService1.jpg)
呵呵,结果好像不对,用户名和密码都没错,调用GetStatus为什么失败了呢?想想这这结果是理所当然的,Session保存数据是靠cookie实现的,我们这个是一个普通的控制台程序,它又没什么地方存放cookie信息,自然不能正确使用了。假如用一个asp程序测试的话,认证功能已经实现,不信你试一下!
但是我们要在普通的应用程序中实现用户认证,难道就没有办法了么,当然有了,既然程序没地方存放cookie,那我们给它一个不就完了嘛,好,我们改写程序如下:
![](http://www.chenjiliang.com/Image/Extension/cs.ico)
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
再Ctrl+F5,变:
![](http://www.chenjiliang.com/Article/ArticleImage/85/1297/WebService2.jpg)
哈,这下对了吧,功夫不负有心人,这下你想用我的WebService就没那么容易了吧,搞定,呵呵!
具体如何实现者一功能有许多方法,在CodeGuru的Build Secure Web Services With SOAP Headers and Extensions
http://www.codeguru.com/Csharp/Csharp/cs_webservices/security/article.php/c5479/
文章中使用了一种不错的方法,可以大体上解决我的问题,但是在Quotes2实现里每次都需要验证一次用户名和密码,而Quote3实现的方法假如使用HTTP GET和HTTP POST好像又会失效,总是感觉美中不足,有没有一种方法可以对WebService的任何调用方式都有效呢?经过多方查找资料,终于找到一个可行的方法:利用Session。假如你编写过Web应用程序的话,对于Session肯定不陌生,对于需要保持状态的程序而言,Session和Application是必不可少的,比如那些论坛和留言版等等。我们这里就要利用相同的机制实现用户认证。
首先我给WebService添加一个名为Login的方法:
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
[WebMethod(EnableSession = true[/b])] public[/b] string[/b] Login(string[/b] userName, string[/b] password) { if[/b] (userName == "username"[/b] && password == "password"[/b]) { Session["login"[/b]] = 1; return[/b] "welcome"[/b]; } else[/b] return[/b] "login failed"[/b]; }
这里仅仅是一个示例,因此我简化了用户的认证过程,Login方法很简单,它所作的工作就是在用户身份验证通过之后将Session["login"]置为1表示用户通过验证,否则返回"login failed"的错误信息。这里的实现和一般的WebMethod没有什么区别,除了多了一个属性EnableSession = true之外。这是我们实现认证功能的关键所在,在这个WebService中,所有的方法都必须使用这个属性加以标记。
好了,服务器端的工作就查不多了(这么简单,不可思议吧),为了检验我们这个方法是否有效,我们再添加一个方法验证一下:
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
[WebMethod(EnableSession = true[/b])] public[/b] string[/b] GetStatus() { if[/b] (Convert.ToInt32(Session["login"[/b]]) == 1) return[/b] "Thank you."[/b]; else[/b] return[/b] "Please Login first."[/b]; }
现在我们来编写一个客户端验证一下到底这个方法是否有效,新建一个控制台程序TestCon,添加这个程序的Web引用,并把引用文件夹重命名为login,编写如下代码:
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
using[/b] System; using[/b] System.Data; using[/b] System.Data.SqlClient; using[/b] TestCon.login; class[/b] MainEntryPoint { static[/b] void[/b] Main(string[/b][] args) { LoginService ls = new[/b] LoginService(); Console.WriteLine(ls.Login("username"[/b], "password"[/b])); Console.ReadLine(); Console.WriteLine(ls.GetStatus()); } }
Ctrl+F5运行程序,程序运行结果如下:
![](http://www.chenjiliang.com/Article/ArticleImage/85/1297/WebService1.jpg)
呵呵,结果好像不对,用户名和密码都没错,调用GetStatus为什么失败了呢?想想这这结果是理所当然的,Session保存数据是靠cookie实现的,我们这个是一个普通的控制台程序,它又没什么地方存放cookie信息,自然不能正确使用了。假如用一个asp程序测试的话,认证功能已经实现,不信你试一下!
但是我们要在普通的应用程序中实现用户认证,难道就没有办法了么,当然有了,既然程序没地方存放cookie,那我们给它一个不就完了嘛,好,我们改写程序如下:
复制
![](http://www.chenjiliang.com/Image/Save.jpg)
保存
using[/b] System; using[/b] System.Data; using[/b] System.Data.SqlClient; using[/b] System.Net; using[/b] TestCon.login; class[/b] MainEntryPoint { static[/b] void[/b] Main(string[/b][] args) { LoginService ls = new[/b] LoginService(); CookieContainer cc = new[/b] CookieContainer(); ls.CookieContainer = cc; Console.WriteLine(ls.Login("username"[/b], "password"[/b])); Console.ReadLine(); Console.WriteLine(ls.GetStatus()); } }
再Ctrl+F5,变:
![](http://www.chenjiliang.com/Article/ArticleImage/85/1297/WebService2.jpg)
哈,这下对了吧,功夫不负有心人,这下你想用我的WebService就没那么容易了吧,搞定,呵呵!
相关文章推荐
- [c#]如何编写需要授权才能使用的WebService?[转]
- [c#]如何编写需要授权才能使用的WebService?
- [webService]如何编写需要授权才能使用的WebService?(原著网事如风)
- 如何编写需要授权才能使用的WebService?
- 如何编写需要授权才能使用的WebService?
- JXLS的使用中,某单个单元格的数据需要通过foreach和if才能得到,使用jxls如何使用
- 利用webservice.htc如何使用Soap标头自定义身份验证和授权
- 使用“成员资格管理用户”以及“Forms 身份验证提供程序”保护需要授权才能访问的资源
- Windows下如何使用QT编写dll程序
- powerbuilder的dw中使用graph风格,当横轴是日期时,如何显示才能完整显示日期?
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 如何使用NUnit编写单元测试
- 在使用Git的时候,需要添加tag,这个对版本号非常有用,但是TortoiseGit中在本地打了tag,不知如何提交
- webservice编写和使用
- 使用sublime编辑器,在编写JSX里面的html时如何使用Emmet?
- 一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句
- Java千百问_02基本使用(012)_如何编写非阻塞SocketChannel程序
- CSDN-markdown语法之如何使用LaTeX语法编写数学公式
- 如何把其他项目中编写好的 自定义控件 放到自己的项目里面使用 (Multi-ListBox ASP.NET控件)