版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 患者观察和巡视管理制度
- 康复用品管理制度
- 2022年三年级语文下册第六单元主题阅读+答题技巧(含答案、解析)部编版
- 【假期阅读技能提升训练】小学语文三年级下册阅读技能提升内文阅读第5讲-附答案.部编版
- 2024年张家口办理客运从业资格证2024年试题
- 2024年巴中申请客运从业资格证考试题和答案
- 2024年武威道路客运输从业资格证理论考试答案
- 2024年天水道路旅客运输驾驶员从业资格考试试题及答案
- 历史-浙江省湖州、衢州、丽水2024年11月三地市高三教学质量检测试卷试题和答案
- 吉首大学《国际商务礼仪》2021-2022学年第一学期期末试卷
- 江苏省苏州市吴中区2024-2025学年八年级上学期期中考试历史卷(含答案)
- 沪科版(2024)八年级全一册物理第一学期期中学业质量测试卷 2套(含答案)
- 化工和危险化学品生产经营单位二十条重大隐患判定标准释义(中化协)
- 愚公移山英文 -中国故事英文版课件
- 课件交互设计
- 生活中的音乐教案
- 辩论赛评分表(完整版)-
- 电子商务支付与安全课程标准
- 海水淡化装置项目投资商业计划书
- 胸痛优秀ppt课件.ppt
- 中级职称述职报告.ppt
评论
0/150
提交评论