对于许多asp.net开发人员而言,共享资源的访问是一个重大挑战,当开发web表单和web服务时就会遇到这样的挑战。微软公司的.net拥有全新的用户授权和认证措施,大多数与安全相关的文章和书籍都用相当的篇幅解释表单认证,但是,与iis、网络和操作系统安全相结合来理解asp.net安全架构是提供最佳解决方案的关健。
(图1)
图1描述了由iis和asp.net提供的基本安全表示,它与asp安全相比有根本不同。上面的图来自msdn的网站。当有web请求发生时,下面的事件会依次发生。
1、用户发出http请求。
2、当web请求发生时,它会由以system帐户运行的iis获得。system帐户的功能非常强大,而且拥有所有类型的权限。iis根据选择的认证类型进行认证,并为每名经过认证的用户创建一个访问令牌。如果选择了了匿名认证,它就会为该匿名用户创建一个访问令牌,缺省情况下是iusr_machine。另外,iss还根据配置的授权类型进行认证。例如,iis能够配置得只接受来自特定ip地址的请求。
3、iis将请求和被认证用户的windows访问令牌传递给as.net_isepi.dll,这是一个注册为处理.aspx url的isapi扩展。as.net_isepi.dll是一个iis模块,是iis和asp.net运行时间环境之间的一座桥。as.net_isapi通过命名管道向工作者进程转发该请求。
4、该工作者进程是托管着clr的as.net_wp.exe。缺省情况下,工作者进程以as.net帐户运行。当安装asp.net框架时,系统会创建该本地帐户。与功能强大的system帐户不同的是,as.net帐户的功能十分有限。asp.net根据其认证配置对请求者进行认证。认证以xml格式配置在该项目的web.config文件中。如果asp.net被配置为windows认证,它会接受任何来自iis的令牌,而不会进行其它认证。另外,asp.net还授权对请求的资源和文件的访问。例如,fileauthorizationmodel可以用来检查用户是否具有访问请求的资源所需要的权限。对于windows认证而言,用户的访问令牌为acl。
5、如果整个过程发展到了这一步,应用软件就会使用特定的身份访问资源。缺省情况下,as.net进程帐户提供这一身份。但是,如果允许模仿,可以使用用户原来的身份或对模仿进行配置,使应用程序能够以特定的身份运行。
既然安全措施已经阐明,在假设ntfc的权限被设置为网络资源的情况下,用户就可以访问数据了。在进一步向前发展之前,有二个重要问题需要解决。一个是指定和定义访问unc共享上文件和文件夹的任务,换句话说,也就是访问网络上共享的文件和文件夹。另一个问题是决定用来完成资源访问任务的身份。为了完成第一个任务,需要首先完成第二个任务。
有几种方法可以用来访问网络资源:
·使用asp.net进程身份
·使用匿名用户帐户
·使用logonuser api
·使用服务性的组件(企业服务)
使用asp.net进程身份似乎有很明显的缺陷。缺省情况下,当应用程序试着访问资源时,asp.net进程身份提供一个身份(as.net)。最简单的解决方案是创建一个具有与远程计算机上相匹配的用户名和密码的本地帐户。大多数企业都会有庞大的内联网,因此这一方法是不切实际的。另外,知道是谁在访问资源也是非常重要的。尽管该方法足以访问网络资源,但效率不够高;第二个方法是使用匿名帐户,例如iusr_machine。与上面的原因相同,这种方法的效率显然也不高;第三种方法是使用logonuser api,这种方法要求通过调用win32 logonuser api模仿一个特定的身份,还可以通过配置asp.net项目web.config文件中的<identity>元素进行模仿。据msdn上的一篇文章称,不建议用户使用以上这些方法,应当避免在windows 2000服务器上使用它们,因为它们要求向asp.net帐户进程授予“作为操作系统一部分运行”的权限,从而极大地降低了web应用程序的安全性。因此,该方法也不理想。最后,也是最可行的解决该问题的方法是使用配置为作为用于访问网络资源固定身份运行的服务性组件。这种方法听起来令人胆怯,但它是目前最好的解决方案,它的架构如下图所示:
(图2)
梅耶在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/d.netsec/html/se.netch08.asp上发表的一一篇有关安全的文章中表示,在企业服务服务器应用程序中使用服务性组件有以下好处:
·在使用的身份方面的灵活性,不必只依赖于asp.net身份。
·受信任或权限较高的代码能够与主web应用程序隔离。
·增加的进程跃距提高了攻击难度,它使得黑客更难跨越进程的边界,使用具有较高权限的进程。
·如果需要手动处理logonuser api调用的模仿,我们可以在一个与主web应用程序隔离的进程中完成这一工作。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器