体系结构 图 1 显示在 ASP.NET 中驻留远程对象时的基本 .NET Remoting 体系结构。如果主要关心安全性问题,那么建议使用 ASP.NET 主机和 HTTP通道进行通信,因为它允许远程对象利用 ASP.NET和 IIS 提供的基本安全服务。
有关可能使用的主机和通道类型范围的详细信息以及比较信息,请参见本章后面的“选择一个主机进程” 。
图 1. .NET Remoting 体系结构
客户端与进程内的代理对象进行通信。可以通过远程对象代理设置身份验证凭证(例如,用户名、密码和证书等等)。方法调用通过接收链进行传递(您可以实现自己的自定义接收来执行数据加密),并到达负责通过网络发送数据的传输接收。在服务器端,调用通过相同的管道进行传递,并向对象发出调用。
注 本章中使用的术语“代理” 一词是指客户端进程内的代理对象,客户端通过该对象与远程对象进行通信。不要将它与术语“代理服务器”混淆。
Remoting 接收 当客户端在远程对象上进行方法调用时,.NET Remoting 使用传输通道接收、自定义通道接收和格式化程序通道接收。
传输通道接收 传输通道接收通过网络在客户端与服务器之间传递方法调用。.NET提供了 HttpChannel 和 TcpChannel 类,但是,可以对体系结构进行完全扩展,并且插入您自己的自定义实现方法。
• HttpChannel。在将远程对象驻留在 ASP.NET 中时,可以使用此通道。此通道使用 HTTP 协议在客户端和服务器之间发送消息。
• TcpChannel。在将远程对象驻留在 Microsoft® Windows® 操作系统服务或其他可执行文件中时,可以使用此通道。此通道使用 TCP 套接字在客户端和服务器之间发送消息。
• 自定义通道 。自定义的传输通道可以使用任何基本的传输协议在客户端和服务器之间发送消息。例如,自定义通道可以使用命名管道或邮件槽。
比较传输通道接收 下表对两个主要的传输通道接收进行了比较。
自定义接收
可以在通道接收管道内的不同位置上使用自定义通道接收来修改在客户端和服务器之间发送的消息。提供加密和解密功能的通道接收就是一个自定义通道接收的示例。
格式化程序接收 格式化程序接收获取方法调用,并将它们序列化为可通过网络发送的流。.NET 提供两种格式化程序接收:
• 二进制格式化程序。它使用 BinaryFormatter 类将方法调用打包为一个序列化的二进制流,然后传递该流(使用 HTTP POST)以便向服务器发送数据。二进制格式化程序将 HTTP 请求中的内容类型设置为“application/octet-stream”。
与 SOAP 格式化程序相比,二进制格式化程序可以提供更高的性能。
• SOAP 格式化程序.它使用 SoapFormatter 类将方法调用打包为 SOAP 消息。在HTTP 请求中将内容类型设置为“text/xml”,并使用 HTTP POST 将其传递到服务器。
对驻留在 ASP.NET 中的请求进行剖析 远程对象终结点的地址是由以 .rem 或 .soap 扩展文件名结尾的 URL 指定的(例如 http://someserver/vDir/remoteobject.soap)。当 IIS 收到远程对象(带有 .rem 或 .soap 扩展名)的请求时,就会将它(在 IIS 中)映射到 ASP.NET ISAPI 扩展 (Aspnet_isapi.dll) 中。ISAPI 扩展将该请求转发到 ASP.NET 辅助进程 (Aspnet_wp.exe) 中的应用程序域。图 2 显示了事件的顺序。
图 2. 服务器端处理
图 2 显示了以下事件顺序:
1.通过 HTTP 接收 .soap 或 .rem 请求,并将其映射到 Web 服务器上的特定虚拟目录。
2.IIS 检查 .soap/.rem 映射,然后将文件扩展名映射到 ASP.NET ISAPI 扩展 Aspnet_isapi.dll 中。
3.ISAPI 扩展将请求传递给 ASP.NET 辅助进程 (Aspnet_wp.exe) 中的应用程序域。如果这是在该应用程序上发送的第一个请求,则创建一个新的应用程序域。
4.调用 HttpRemotingHandlerFactory 处理程序,然后 remoting 基础结构读取 Web.config 文件中的 <system.runtime.remoting> 部分,它控制服务器端的对象配置(例如,单个调用或单个参数)和授权参数(使用 < authorization> 元素)。
5.Remoting 基础结构查找包含远程对象的程序集并对其进行实例化。
6.Remoting 基础结构读取 HTTP 标头和数据流,然后在远程对象上调用该方法。
注:在此进程中,ASP.NET 调用正常的事件处理程序序列。您可以有选择地在 Global.asax 中实现一个或多个事件处理程序,例如, BeginRequest、AuthenticationRequest、AuthorizeRequest 等等。在请求到达远程对象方法时,将代表已验证用户的 IPrincipal 对象存储在 HttpContext.User (和 Thread.CurrentPrincipal) 中,并且可以将它用于授权。例如,使用用户权限要求和编程角色检查。
ASP.NET 和 HTTP 通道 Remoting 没有其自己的安全模型。客户端(代理)和服务器(远程对象)之间的身份验证和授权是通过通道和主机进程执行的。可以组合使用以下的主机和通道:
• 自定义的可执行文件和 TCP 通道。这种组合不提供任何内置的安全功能。
• ASP.NET 和 HTTP 通道.这种组合通过基本的 ASP.NET 和 IIS 安全功能提供身份验证和授权。
ASP.NET 中驻留的对象可以利用 ASP.NET 和 IIS 的基本安全功能。它们包括:
• 身份验证功能。在 Web.config 中配置 Windows 身份验证功能:
<authentication mode="Windows"/>
IIS 中的设置控制所使用的 HTTP 身份验证类型。
通用的 HTTP 标头用于对请求进行身份验证。可通过配置远程对象代理为客户端提供凭据,也可以使用默认凭据。
不能使用表单或 Passport 身份验证,因为通道没有提供允许客户端访问 Cookies 的方法,而这是这两种身份验证机制的一个要求。另外,表单和 Passport 身份验证需要重定向到要求客户端交互的登录页面。远程的服务器端对象可用于非交互式的场合。
• 授权功能。使用标准的 ASP.NET 授权方法对客户端进行授权。
可配置的授权选项包括:
• URL 授权。
• 文件授权(它需要特定的配置。有关说明,请见本章后面的“使用文件授权”)。
编程授权选项包括:
• 用户权限要求(说明性和命令性的)。
• 使用 IPrincipal.IsInRole 进行明确的角色检查。
• 安全通信功能。应该使用 SSL(和/或 IPSec)保护客户端和服务器之间数据传输的安全。
.NET Remoting 网关守卫 ASP.NET 驻留的远程对象使用的授权点(或者网关守卫)包括:
• IIS。如果关闭了匿名身份验证,则 IIS只允许来自特定用户的请求,即它可以在其自己的域或受信任的域中验证这些用户的身份。 IIS 还提供 IP 地址和 DNS 过滤功能。
• ASP.NET
• UrlAuthorizationModule。可以配置应用程序 Web.config 中的< authorization> 元素,控制哪些用户和用户组可以访问应用程序。授权是以存储在 HttpContext.User 中的 IPrincipal 对象为基础。
• FileAuthorizationModule。FileAuthorizationModule 可用于远程组件,但这需要进行特定的配置。有关说明,请参见本章后面的“使用文件授权”。
注要进行文件授权,并不要求使用模拟功能。
FileAuthorizationModule 类只对请求的文件或 URI(例如,.rem 和 .soap)执行访问检查,而不对在远程对象中通过代码访问的文件执行访问检查。
• 用户权限要求和明确的角色检查。除了使用 IIS 和 ASP.NET 可配置的网关守卫外,还可以将用户权限要求(以说明性方式或命令性方式)用作附加的细分访问控制机制。通过使用用户权限检查,您可以根据各个用户的标识和组成员身份(由附加到当前线程的IPrincipal 对象定义)控制对类、方法或个别代码块的访问。
注用于请求角色成员身份的用户权限检查与调用IPrincipal.IsInRole 来测试角色成员身份不同。如果调用者不是指定角色的成员,则前者会出现异常错误,而后者只返回一个布尔值来确认角色成员身份。
利用 Windows 身份验证,ASP.NET 能自动将一个代表已验证身份用户的WindowsPrincipal 对象连接到当前的 Web 请求(使用 HttpContext.User)。
身份验证 在结合使用 Remoting 和 ASP.NET Web 应用程序客户端时,就会在 Web 应用程序和远程对象主机上进行身份验证。远程对象主机可以使用的身份验证选项取决于主机类型。
驻留在 ASP.NET 中 当对象驻留在 ASP.NET 中时,可以使用 HTTP 通道在客户端代理和服务器之间传递方法调用。HTTP 通道使用 HTTP 协议对服务器的远程对象代理进行身份验证。
以下列表说明在 ASP.NET 中驻留对象时可以使用的一组身份验证选项:
• IIS身份验证选项。匿名、基本、摘要、Windows 集成和证书。
• ASP.NET 身份验证选项。Windows 身份验证或无(用于自定义的身份验证实现)。