日期:2010-06-18  浏览次数:20395 次

  适用于:

  Microsoft ASP.NET 2.0
  Microsoft Visual Studio 2005
  Microsoft Internet 信息服务

  摘要:Peter Kellner 就创建应用程序来管理 Microsoft ASP.NET 2.0 成员身份数据库写了两篇文章,这是第一篇。本文主要论述如何保证解决方案的安全性以确保只有适合的管理员才能访问这些数据。

  摘要

  本系列由两篇文章组成,论述如何安全使用和设置用于管理 ASP.NET Membership 与 Roles 的三层解决方案,本文是第一篇。本文将主要论述如何配置、使用以及(最重要的是)保证此解决方案的安全性,并概述如何将其在典型的 Microsoft ASP.NET 2.0 Web 解决方案中实现。MembershipRoles 对象被视为可运作,而不用深究其内部结构。管理 Members 和 Roles 似乎与管理简单数据源中的数据无异。在第二篇文章中,将详细说明这些控件和对象的内部结构,以便开发人员能够使用类似的技术创建自己的控件和对象。

  简介

  ASP.NET 2.0 将用户身份验证直接扩展到了应用程序编程领域。使用标准的 .NET 库引用 (system.web.security),开发人员只需另外进行非常少的工作就可以为其应用程序创建完全身份验证。请记住,必须执行必要的操作以尽可能保证创建的应用程序在使用期间的安全性。

  本文概述了安全机制并显示了示例安全设置,这些设置是为 Web 应用程序创建安全环境的基本要素。ASP.NET 2.0 提供了许多不同的配置选项,这些选项是否必要取决于安全要求。本文将介绍这些配置选项的优缺点。

  安全性注意事项

  保证物理环境的安全性

  人们常说,计算机的安全性由计算机前端面板上的电源开关来决定。无论操作系统级别对系统的保护有多么严密,物理保护都是最基本的。所以必须假定任何有权以物理方式访问计算机的用户始终能够以某种方式危害计算机的完整性。

  保证域环境的安全性

  必须遵循设置用户帐户、密码和权限的最佳做法。例如,如果不具有相应权限的用户能够直接访问包含 Web 应用程序所用的安全数据的数据库,则该应用程序可能会受到危害。

  保证 .NET 环境的安全性

  .NET 环境允许设置代码访问安全性。这意味着各个系统和应用程序库可以与不同的信任级别相关联。这在某些环境中是非常重要的,例如,可以运行多个 Web 应用程序的共享宿主环境。可能由不同用户拥有的每个 Web 应用程序可能会要求彼此隔离与保护。此外,如果不进行这种隔离,每个 Web 应用程序都可能影响关键的系统功能。

  本文假定 ASP.NET 用户(IIS 代表该用户运行)以最高信任级别运行。这就好像 Web 应用程序在专门环境中运行一样。

  ASP.NET 与 IIS 的关系

  在与 IIS 配合工作时,ASP.NET 支持三种身份验证提供程序:Forms 身份验证(使用应用程序特定的逻辑)、Passport 身份验证(由 Microsoft 提供的集中身份验证服务)和 Windows 身份验证(使用直接通过 IIS 提供的身份验证)。本文使用的是 ASP.NET 项目的默认身份验证:Forms 身份验证。身份验证模式在 web.config 文件中指定。语法选择如下。

<authentication mode = "{Windows|Forms|Passport|None}">
</authentication>

  流程图中描述了用户从 Web 客户端登录时要遵循的流程。

  请记住,这篇文章编写于 2001 年,当时的流程是相应于 IIS 5.1 而言的,而不是目前的 IIS 6.0 或更高版本。

使用 IIS 进行ASP.NET 成员/角色管理(1):安全和配置概述

图 1:IIS 与 ASP.NET 之间的安全流程

  ASP.NET 2.0 网站中基于角色的安全性

  初始安装与配置

  web.config 文件/不常改动项

  web.config 文件中设置了一些影响 ASP.NET 2.0 Web 应用程序总体运行情况的参数。示例参数包括,对成员身份提供程序(或数据库)的引用、所需密码强度以及是否要求注册电子邮件。下面显示了 web.config 文件中的相关部分,其中包含最低安全性配置值示例。详细信息可通过以下方式获得:访问 Visual Studio 2005 帮助,然后查阅“Membership Members”。每个安全性参数在此均有详细说明。

<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,
System.Web, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer" 
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
minRequiredPasswordLength="1"
minRequiredNonalphanumericCharacters="0"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
commentTimeout=""/>
</providers>

  除了上面显示的 web.config 文件部分外,machine.config 文件中包含与 Membership 关联的数据库的默认连接字符串。可以在 web.config 文件中配置一个不同的连接字符串。要添加附加安全性,可以编码连接字符串,并可以加密 Membership 数据库密码。许多文章已针对这些折衷方法进行了论述。Microsoft 的快速入门指南(英文)中提供了有关如何在 web.config 文件中使用加密的很好的示例。

  web.config 文件/.aspx 页面安全性

  可以为 Web 应用程序中的每个网页指定一个安全级别。通过指定访问页面所需具备的角色即可执行此操作。web.config 文件中的语法非常简单。例如,以下 web.config 片段指定了只有角色被指定为 Administrator 的用户才能访问网页 MembershipGrid.aspx。

<system.web>
<location path="MembershipGrid.aspx" >
<system.web>
<authorization >
<allow roles="Administrators"/>
</authorization>
</system.web>
</location>
</system.web>

  又例如,要指定只有特定角色才能访问