Web Service的安全机制_第1页
Web Service的安全机制_第2页
Web Service的安全机制_第3页
Web Service的安全机制_第4页
Web Service的安全机制_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Web Service的安全机制Web Service的安全机制Web Service的安全机制 Web Service的安全机制一个 Web 应用程序具有的一个重要部分是:能够识别用户和控制对资源的访问。确定请求实体身份的行为称为身份验证。通常,用户必须出示凭据(如名称/密码对)以便进行身份验证。一旦经过验证的标识可用,就必须确定此标识是否可以访问给定的资源。Web Service的安全机制主要从两个方面考虑, 一个是利用Windows安全机制,另一个就是利用SOAP标头,下面分别进行讨论。一、 利用Windows安全机制我们来做一个实验,首先做一个最简单的Web服务程序。<WebMe

2、thod()> Public Function HelloWorld() As String HelloWorld = "Hello World"End Function完成以后,打开Internet服务管理器。 找到这个服务程序的虚拟目录,右键,选择“属性”。找到“目录安全性”选项卡。编辑“匿名访问和验证控制”。 取消“匿名访问”和“集成Windows验证”,选择“基本验证”。 好了,现在如果再想打开这个程序,就会提示用户名和密码,而这个权力是在服务器上设置的。 现在我们来做一个客户程序,这是一个普通的Windows程序。添加Web引用。 在输入Web Servic

3、e的地址以后,它就会提示你输入用户名和密码,如果不对,你是没有办法调用这个Web服务的。 在输入服务器正确的用户名和密码以后,你就可以使用了。 现在做一个Button来调用远程的方法。Public Class Form1Inherits Dim a As New localhost.Service2() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(ByVal send

4、er As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try MsgBox(a.HelloWorld) Catch MsgBox("请求失败") End Try End SubEnd Class你会发现,运行以后将提示你“运行失败”,这就是说,调用这个方法的时候,还要发送这个服务器的用户名和密码上去。我们可以采用这个方法来解决:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArg

5、s) Handles MyBase.Load 'a.Credentials获取或设置Web服务客户端身份验证的安全凭据 为基于密码的验证方案提供凭据 a.Credentials = New System.Net.NetworkCredential("Administrator", "")End Sub 好了,现在能正常工作了。C#代码:user107.Service1 obj=new user107.Service1();private void button1_Click(object sender, System.EventArgs e)la

6、bel1.Text=obj.HelloWorld();private void Form1_Load(object sender, System.EventArgs e) obj.Credentials = new System.Net.NetworkCredential("Administrator", "user107"); 利用这个方式,可以杜绝没有权限的用户调用Web服务。二、使用 Soap 标头自定义身份验证和授权 在 Internet 上,您可能需要对 SQL 数据库执行自定义身份验证和授权。在这种情况中,应向服务传递自定义凭据(如用户名和密

7、码),并让服务自己处理身份验证和授权。 将额外的信息连同请求一起传递给 XML Web 服务的简便方法是通过 SOAP 标头。为此,需要在服务中定义一个从 SOAPHeader 派生的类,然后将服务的公共字段声明为该类型。下面我们通过一个例子来说明这个问题。首先做一个Web服务程序。在这个程序里面,需要注意:服务中的每个 WebMethod 都可以使用 SoapHeader 自定义属性定义一组关联的标头。默认情况下,标头是必需的,但也可以定义可选标头。SoapHeader 属性指定公共字段的名称或者 Client 或 Server 类的属性(本标题中称为 Headers 属性)。在为输入标头调

8、用方法前,WebService 设置 Headers 属性的值;而当方法为输出标头返回时,WebService 检索该值。我们可以先做一个标头类:Public Class AuthHeaderVB : Inherits SoapHeader它继承于SoapHeader,然后把它声明成一个对象: Public sHeader As AuthHeaderVB 然后,所有需要标头控制的方法,都需要在前缀上加上标头声明:<WebMethod(), SoapHeader("sHeader")> Public Function SecureMethod() As Strin

9、g下面是具体的程序,当然为了简单,得到客户传过来的用户名和密码以后,我们并不是用数据库处理,而是简单的用一个IF语句处理,但是这种方法,可以扩大成各种情况:ImportsImports<WebService(Namespace:="/")> _Public Class Service1 Inherits Public Class AuthHeaderVB : Inherits SoapHeader Public Username As String Public Password As String End Class Publ

10、ic sHeader As AuthHeaderVB <WebMethod(), SoapHeader("sHeader")> Public Function SecureMethod() As String If (sHeader Is Nothing) Then Return "错误: 请提供凭据" End If Dim usr As String = sHeader.Username Dim pwd As String = sHeader.Password If (AuthenticateUser(usr, pwd) Then Retu

11、rn "成功: " & usr & "," & pwd Else Return "错误: 未能通过身份验证" End If End Function <WebMethod(), SoapHeader("sHeader")> Public Function HelloWorld() As String If (sHeader Is Nothing) Then Return "错误: 请提供凭据" End If Dim usr As String = sHeade

12、r.Username Dim pwd As String = sHeader.Password If (AuthenticateUser(usr, pwd) Then Return "成功: " & "你好,我的世界" Else Return "错误: 未能通过身份验证" End If End Function Private Function AuthenticateUser(ByVal usr As String, ByVal pwd As String) As Boolean If (Not (usr Is Nothin

13、g) And Not (pwd Is Nothing) Then ' 可在此查询数据库以获取凭据. If usr = "abc" And pwd = "123" Then Return True End If End If Return False End FunctionEnd Class 运行一下,我们可以看到提供方法说明的网站。 但是这里已经不提供测试,而是提供了用户名和密码的加入的说明。POST /WebService1/Service1.asmx HTTP/1.1Host: localhostContent-Type: text/xml

14、; charset=utf-8Content-Length: lengthSOAPAction: "/HelloWorld"<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:soap=&

15、quot;/soap/envelope/"> <soap:Header> <AuthHeaderVB xmlns="/"> <Username>string</Username> <Password>string</Password> </AuthHeaderVB> </soap:Header> <soap:Body> <HelloWorld xmlns=&quo

16、t;/" /> </soap:Body></soap:Envelope>现在我们来做一个客户程序,看看SOAP标头到底有什么样的表现。为了进行测试,我们简单的加三个Button。分别用不同的情况调用Web服务的方法。添加Web引用。代码,第一个事件密码有意给的是错的。Public Class Form1Inherits Dim a As New localhost.Service1() '调用SecureMethod Private Sub Button1_Click(ByVal sender As System

17、.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim myHeader As New localhost.AuthHeaderVB() myHeader.Username = "abc" myHeader.Password = "1234" a.AuthHeaderVBValue = myHeader MsgBox(a.SecureMethod() End Sub '调用HelloWorld Private Sub Button2_Click(ByVal sender As

18、 System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim myHeader As New localhost.AuthHeaderVB() myHeader.Username = "abc" myHeader.Password = "123" a.AuthHeaderVBValue = myHeader MsgBox(a.HelloWorld) End Sub '直接调用HelloWorld Private Sub Button3_Click(ByVal send

19、er As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Try MsgBox(a.HelloWorld) Catch ee As Exception MsgBox(ee.Message) End Try End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End SubEnd Class下面我们来做个实验首先点:“直接调用HelloWorl

20、d”它会提示你“进行调用以前,客户端没有设置SOAP标头”,所以直接调用是不可以的。下面,你点一下“调用SecureMethod”,而程序中有意把提供的密码设成错误的。问题是你再点一下“直接调用HelloWorld”,它也提供了一个密码错误的信息。说明标头的设置对第二个方法也是起作用的。好,现在你点一下“调用HelloWorld”,这段程序的用户名和密码是正确的,成功了。现在,你再点一下“直接调用HelloWorld”,它将出来一个正确的结果,说明只要标头正确,你就可以一直的使用。如果再设置一下错误的标头呢?现在点它又是错误,可以看出来,一个Web服务程序,标头只有一个。利用这个原理,我们就可

21、以设计出很好的具有安全性的程序来。同样的C#代码:服务器:using System.Web.Services.Protocols;public class AuthHeaderVB :SoapHeaderpublic string Username;public string Password;public AuthHeaderVB sHeader;WebMethod(), SoapHeader("sHeader")public string SecureMethod()if (sHeader=null) return "错误: 请提供凭据"string

22、 usr= sHeader.Username;string pwd = sHeader.Password;if (AuthenticateUser(usr, pwd)return "成功: " + usr + "," + pwd;elsereturn "错误: 未能通过身份验证"WebMethod(), SoapHeader("sHeader")public string HelloWorld()if (sHeader=null)return "错误: 请提供凭据"string usr= sHeader.Username;string pwd= sHeader.Password;if (AuthenticateUser(usr, pwd)return "成功: " + "你好,我的世界"elsereturn "错误: 未能通过身份验证"bool AuthenticateUser(string usr, string pwd)if (usr!=null) && (pwd !=null)/可在此查

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论