XML Web Service的安全
- XML Web Service的安全
本章概述
同任何基于Web的应用程序一样,我们也必须确保XML Web Service的安全,以防止出现意外的使用或者故意的误用Web服务的情况。本章介绍了Web服务上下文安全的三个方面——身份验证、授权以及安全通信。
教学目标
- 掌握身份验证和授权的概念
- 理解如何使用IIS和Windows内置的安全机制,这在企业解决方案中属于基础工作
- 掌握使用SOAP头进行Web服务身份验证的方法
- 掌握在Web服务中使用基于角色的安全措施和代码访问的安全措施
- 对Web服务消费者和Web服务之间的通信进行加密
教学重点
- 掌握身份验证和授权的概念
- 理解如何使用IIS和Windows内置的安全机制
- 掌握使用SOAP头进行Web服务身份验证的方法
- 掌握在Web服务中使用基于角色的安全措施和代码访问的安全措施
- 对Web服务消费者和Web服务之间的通信进行加密
教学难点
- 掌握使用SOAP头进行Web服务身份验证的方法
- 掌握在Web服务中使用基于角色的安全措施和代码访问的安全措施
教学资源
|
先修知识
在正式开始学习本章内容以前,学生须具备下列知识基础。
知识基础 | 推荐补充 |
熟悉.NET编程基础 | 《面向Web的.NET应用程序设计》或《基于.NET的桌面应用程序设计》 |
建议学时
课堂教学(4课时)+实验教学(6课时)
教学过程
- 安全概述
教学提示 :
本节主要达到两个目的。
- 理解授权和身份验证的概念。(精讲)
- 理解Web服务中的安全问题,企业解决方案中安全问题是用户相当关心的问题。(精讲)
内容 | 教学方法 | 提示 |
讲授:
在掌握Web服务安全的概念之前,让我们先了解身份验证和授权这两个容易混淆的概念。 身分验证解决了“我是谁”的问题,授权解决了“我可以干什么”的问题。从而系统可以知道当前用户可以访问哪些资源,比如文件、数据库以及其他系统资源。 讲授课本 |
阅书:7.1.1
幻灯:第4-5页 |
|
讲授:
身份验证的类型分为IIS身份验证、ASP.NET身份验证、表单验证和Passport身份验证和自定义SOAP头身份验证5种。下面我们来分别了解一下。 讲授课本 |
阅书:7.1.2
幻灯:第6页 |
建议补充Visual Studio .NET联机帮助中的内容 |
讲授:
在ASP.NET环境、.NET Framework和Windows平台提供了几种技术用于授予系统资源的访问权限。 讲授课本 |
阅书:7.1.3
幻灯:第7-8页 |
|
讲授:
为了防止信息在互联网上传输的时候被截取,我们也应该对传输的信息进行加密。 讲授课本 |
阅书:7.1.4
幻灯:第9页 |
|
小结:
本节我们研究了Web服务中的安全问题并且学习了身份验证和授权的概念。这些都是企业非常关心的问题,是企业解决方案中安全的基石。 |
- 内置身份验证
教学提示 :
本节主要达到一个目的。
- 理解内置身份验证的概念。(精讲)
内容 | 教学方法 | 提示 |
讲授:
基本和简要身份验证的 System.Net 实现符合 RFC2617 - HTTP 身份验证:基本和简要身份验证(可在位于 www.w3c.org 的万维网联合会的 Web 站点上找到)。 若要使用基本和简要身份验证,应用程序必须在用来从 Internet 请求数据的 WebRequest 对象的 Credentials 属性中提供用户名和密码,如下例所示。 [Visual Basic] Dim MyURI As String = "http://www.contoso.com/" Dim WReq As WebRequest = WebRequest.Create(MyURI) WReq.Credentials = New NetworkCredential(UserName, SecurelyStoredPassword) [C#] String MyURI = "http://www.contoso.com/"; WebRequest WReq = WebRequest.Create(MyURI); WReq.Credentials = new NetworkCredential(UserName, SecurelyStoredPassword); 讲授课本 |
阅书:7.2.1
幻灯:第12-13页 |
结合VS.NET 2003的帮助文档 |
讲授:
集成 Windows 身份验证(以前称为 NTLM 身份验证和 Windows NT 质询/响应身份验证)可以使用 NTLM 或 Kerberos V5 身份验证,并且只能与 Internet Explorer 2.0 及更高版本一起使用。 当 Internet Explorer 试图访问受保护的资源时,IIS 发送两个 WWW 身份验证头,Negotiate 和 NTLM。 如果 Internet Explorer 识别 Negotiate 头,它将选择 Negotiate 头,因为首先列出 Negotiate 头。当使用 Negotiate 时,浏览器将同时为 NTLM 和 Kerberos 返回信息。在服务器端,如果客户端(Internet Explorer 5.0 和更高版本)和服务器(IIS 5.0 和更高版本)都运行 Windows 2000 和更高版本,并且都是同一域或多个受信域的成员,则 IIS 将使用 Kerberos。否则,服务器将默认使用 NTLM。 如果 Internet Explorer 不能识别 Negotiate,它将使用 NTLM。 因此,所使用的机制由 Internet Explorer 与 IIS 之间的协商来决定。 当与 Kerberos v5 身份验证一同使用时,IIS 可以在运行 Windows 2000 和更高版本的受信任并为委托配置的计算机之间委托安全凭据。委托允许代表进行委托的用户对资源进行远程访问。 集成 Windows 身份验证是 Intranet 环境中最好的身份验证方案,在这种用户拥有 Windows 域帐户,尤其是在使用 Kerberos 的时候。集成 Windows 身份验证与简要身份验证一样,不在网络上传递用户密码,而是交换哈希值。有关更多信息,请参见 IIS documentation(IIS 文档)(http://www.microsoft.com/windows2000/en/server/iis/)。 优点 可与 Kerberos 一起使用,启用对安全凭据的委托。 使用 Windows 的 Intranet 环境的最佳方案。 缺点 不能通过代理穿过防火墙验证身份,除非通过 PPTP 连接使用它。 如果选择了 NTLM,则它不支持对其他服务器的委托。 仅 Internet Explorer 2.0 及更高版本支持它。 仅 IIS 5.0 和更高版本支持 Kerberos。 讲授课本。 |
阅书:7.2.2
幻灯:第14页 |
|
讲授:
在学习了基本的身份验证方式之后,我们来看一下如何在IIS中进行配置。 讲授课本。 演示: 书上的例子 |
阅书:7.2.3
幻灯:第15-18页 |
|
小结:
Windows系统和.NET Framwork提供了多种方法识别当前用户的身份,一般来说,这些方法都是利用用户通过某种可信赖的方式递送自己的“名片”来实现的。 |
- 使用SOAP头自定义身份验证
教学提示 :
本节主要达到一个目的。
- 掌握使用SOAP头自定义身份验证的方法。(精讲+演示)
内容 | 教学方法 | 提示 |
讲授:
我们先来看一下如何在Web服务中使用SOAP头。 讲授课本。 |
阅书7.3.1
幻灯:第21-23页 |
|
讲授:
接下来我们演示如何在Web服务消费者中使用SOAP头。 讲授课本。 演示: 书上的代码 |
阅书7.3.2
幻灯:第24-25页 |
|
小结:
我们在前面的章节中就提到过,SOAP是Web服务的基础协议之一。在该协议中,同样规定了有关身份验证的方法。我们在本节学习了相关知识。并且在学习了身份验证之后,我们将在下一节进入授权的学习。 |
- 使用基于角色安全进行授权
教学提示 :
本节主要达到一个目的。
- 掌握使用基于角色安全进行授权的方法。 (精讲+演示)
内容 | 教学方法 | 提示 |
讲授:
标识对象封装有关正在验证的用户或实体的信息。在最基本的级别上,标识对象包含名称和身份验证类型。名称可以是用户名或 Windows 帐户名,而身份验证类型可以是所支持的登录协议(如 Kerberos V5)或自定义值。.NET Framework 定义了一个 GenericIdentity 对象和一个更专用的 WindowsIdentity 对象;前者可用于大多数自定义登录方案,而后者可用于在希望应用程序依赖于 Windows 身份验证的情况中。此外,您还可以定义自己的标识类来封装自定义用户信息。 IIdentity 接口定义用于访问名称和身份验证类型(如 Kerberos V5 或 NTLM)的属性。所有 Identity 类均实现 IIdentity 接口。Identity 对象同执行当前线程所用的 Windows NT 进程标记之间不需要有什么关系。但是,如果 Identity 对象是 WindowsIdentity 对象,则假定标识表示 Windows NT 安全标记。 |
阅书7.4.1
幻灯:第28-29页 |
|
讲授:
主体对象表示运行代码的安全性上下文。实现基于角色的安全性的应用程序根据同主体对象的关联角色授予权限。同标识对象类似,.NET Framework 提供 GenericPrincipal 对象和 WindowsPrincipal 对象。您还可以定义自己的自定义主体类。 IPrincipal 定义一个属性和一种方法,前者用于访问关联的 Identity 对象,而后者用于确定 Principal 对象所标识的用户是否为给定角色的成员。所有 Principal 类都实现 IPrincipal 接口以及任何必需的附加属性和方法。例如,公共语言运行库提供了 WindowsPrincipal 类,该类实现将 Windows NT 或 Windows 2000 组成员条件映射到角色的附加功能。 Principal 对象在应用程序域 (AppDomain) 中绑定到调用上下文 (CallContext) 对象。默认的调用上下文总是用每个新的 AppDomain 创建的,因此总是存在可用于接受 Principal 对象的调用上下文。创建新线程的同时也为该线程创建 CallContext 对象。Principal 对象引用从创建线程自动复制到新线程的 CallContext 中。如果运行库无法确定哪个 Principal 对象属于线程的创建者,它将遵循 Principal 和 Identity 对象创建的默认策略。 可配置的应用程序域特定策略定义了一些规则,用以决定同新的应用程序域关联的 Principal 对象类型。在安全策略的允许范围内,运行库可创建 Principal 和 Identity 对象来反射同当前执行线程关联的操作系统标记。默认情况下,运行库使用 Principal 和 Identity 对象表示未经身份验证的用户。运行库不创建这些默认的 Principal 和 Identity 对象,除非代码试图访问它们。 创建应用程序域的受信任代码可设置应用程序域策略,以控制默认 Principal 和 Identity 对象的构造。此应用程序域特定的策略适用于该应用程序域中的所有执行线程。非托管、受信任的宿主本身就具有设置此策略的能力,但托管代码必须具有控制域策略的 System.Security.Permissions.SecurityPermission 才能设置此策略。 在不同的应用程序域之间、但在同一进程内(因此在同一台计算机上)传输 Principal 对象时,远程基础结构将同调用方上下文相关联的、对 Principal 对象的引用复制到被调用方的上下文中。 |
阅书7.4.2
幻灯:第30页 |
|
讲授:
介绍完理论后,我们来看一下WindowsIdentity和WindowsPrincipal的具体使用方法。 讲授课本 |
阅书7.4.3
幻灯:第31页 |
|
讲授:
下面我们看看GenericIdentity和GenericPrincipal对象的具体使用方法。 讲授课本 |
阅书7.4.4
幻灯:第32页 |
|
讲授:
ASP.NET 在 Global.asax 中提供多个模块,这些模块参与每个请求并公开您可以处理的事件。您可以随意自定义或扩展这些模块,或开发全新的自定义模块来处理对基于 ASP.NET 的应用程序进行的 HTTP 请求的信息及其相关信息。例如,您可以创建一个输出缓存模块,该模块实现整个应用程序的输出缓存行为。 所有模块(不管是自定义的还是 .NET Framework 提供的)必须实现 IHttpModule 接口。只要这些模块注册到应用程序,您便可以方便地与进入应用程序的 HTTP 请求进行交互。 处理 HttpModule 事件 可以使用 Global.asax 文件来处理请求中模块公开的任何事件。例如,您可以为 ASP.NET Web 应用程序创建一个自定义身份验证模块,在该模块中可以公开一个 OnAuthenticateRequest 事件。您编写的处理 HTTPModule 模块所公开的事件的代码必须符合以下命名模式: FriendlyModuleName_EventName(AppropriateEventArgumentSignature) 例如,如果要包括会话的开始和结束以及 OnAuthenticateRequest 事件的事件处理代码,则它看起来可能像下面这样。 [Visual Basic] <Script language="VB" runat="server"> Sub Session_OnStart() 'Session start-up code goes here. End Sub Sub Session_OnEnd() 'Session clean-up code goes here. End Sub Sub Application_OnAuthenticateRequest(Source As Object, Details as EventArgs) 'Authentication code goes here. End Sub </script> [C#] <Script language="C#" runat="server"> void Session_OnStart() { // Session start-up code goes here. } void Session_OnEnd() { // Session clean-up code goes here. } void Application_OnAuthenticateRequest(Object Source, EventArgs Details) { // Authentication code goes here. } 讲授课本 |
阅书7.4.5
幻灯:第33页 |
|
小结:
本节我们学习了基于角色的授权。简单的说,一个公司中,“保安”和“公司普通职员”都是角色,他们拥有不同的权利和权限。每个公司成员都属于一类或者几类角色。 |
- 使用代码访问安全进行授权
教学提示 :
本节主要达到一个目的。
- 掌握使用代码访问安全进行授权的方法。(精讲)
内容 | 教学方法 | 提示 |
讲授:
首先我们先来看一下代码访问安全基础。 讲授课本。 |
阅书7.5.1
幻灯:第36-38页 |
|
讲授:
接下来我们介绍在ASP.NET Web服务中的代码访问安全。 讲授课本。 |
阅书7.5.2
幻灯:第39页 |
|
小结:
我们在本节中学习了代码访问安全的基础,大家一定要多实践,多练习,提高自己的熟练程度。 |
- 加密
教学提示 :
本节主要达到一个目的。
- 掌握为Web服务加密的方法。(精讲+演示)
内容 | 教学方法 | 提示 |
讲授:
要加密Web服务的通讯渠道,应该首先配置SSL 讲授课本。 |
阅书7.6.1
幻灯:第42-43页 |
|
讲授:
接下来我们演示如何使用自定义SOAP扩展实现安全特性。 讲授课本。 |
阅书7.6.2
幻灯:第44页 |
|
讲授:
接下来我们演示如何实现SOAP扩展。 演示: 书上的代码 |
阅书7.6.3
幻灯:第45页 |
|
讲授:
接下来我们演示如何实现一个自定义属性。 演示: 书上的代码 |
阅书7.6.4
幻灯:第46页 |
|
讲授:
最后我们演示如何使用地定义属性 演示: 书上的例子 |
阅书7.6.5
幻灯:第47页 |
|
小结:
加密拥有非常悠久的历史,我们在本节中学习了相关的基础,用来保护我们的Web服务的数据传输安全。 |
总结
经过本章的学习,我们了解了下列的知识和内容。
- 身份验证和授权的概念
- 如何使用IIS和Windows内置的安全机制
- 使用SOAP头进行Web服务身份验证的方法
- 在Web服务中使用基于角色的安全措施和代码访问的安全措施
- 对Web服务消费者和Web服务之间的通信进行加密
在本章中,我们学习了Web服务中的安全特性,下一章,我们将学习如何设计一个优秀的Web服务。
布置作业
- 完成书后习题1-9
- 预习书中所有实验,并填写操作步骤。在实验课上准备操作