演练:根据安全角色筛选站点地图节点

更新:2007 年 11 月

网站的一个常见要求是限制对某些页的访问。ASP.NET 角色管理和 ASP.NET URL 授权的组合提供了根据安全角色限制对 Web 文件的访问的方法。站点地图使用一种称为“安全修整”的功能隐藏指向那些受限制的文件的导航链接(也基于角色),从而实现这个目的。

角色是用户组的名称。在建立角色之后,可以将各个用户帐户分配到角色。可以根据角色限制对站点地图中的 Web 文件和节点的访问。

通过此演练,您将学会如何执行以下任务:

  • 创建具有成员资格和用户登录功能的网站。

  • 为网站建立角色并将用户帐户分配到建立的角色。

  • 创建 URL 授权规则,这些规则有选择地授予或拒绝对页的访问。

  • 创建站点地图并启用安全修整。

  • 在网页上创建导航菜单。

先决条件

为了完成本演练,您需要:

  • Microsoft Visual Web Developer。

  • .NET Framework。

  • 计算机上本地安装的 Internet 信息服务 (IIS)。

  • 本演练还需要一种标识各个用户帐户的方法。在工作应用程序中,可以通过各种方法标识用户,例如通过他们的 Windows 用户帐户进行标识。但是在本演练中,用户将通过登录站点标识他们自身。因此,本演练要求有一个已配置为使用 ASP.NET 成员资格和 Forms 身份验证的站点。如果有一个已经配置了成员资格的站点,可以使用该站点作为本演练的起点。

创建具有成员资格和用户登录功能的网站

在使用 ASP.NET 成员资格和角色之前,必须有一个可用的网站,然后需要配置该网站以启用成员资格和设置角色。如果已经完成演练:创建具有成员资格和用户登录功能的网站,则可以使用在该演练中配置的网站。

创建网站

如果已经在 Visual Web Developer 中创建了网站(例如,按照演练:在 Visual Web Developer 中创建基本网页中的步骤),则可以使用该网站并跳到下一节。否则,按照下面的步骤创建一个新的网站和网页。

创建本地 IIS 网站

  1. 打开 Visual Web Developer。

  2. 在**“文件”菜单上单击“新建网站”**。

    出现**“新建网站”**对话框。

  3. 在**“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”**。

  4. 在**“语言”**下拉列表中,单击您想使用的编程语言。

  5. 在**“位置”下拉列表中,选择“HTTP”**。

    或者,如果没有可用的 IIS 服务器,可以选择**“文件系统”。但是,使用“HTTP”**与实际部署方案相似,并允许通过在浏览器中查看页来进行测试。

  6. 单击**“浏览”**。

    出现**“选择位置”对话框。如果在前一步中选择了“HTTP”,则“本地 IIS”按钮应该是已选定的。如未选定,请单击“本地 IIS”**。

  7. 选择**“默认网站”**节点。

  8. 单击**“创建新 Web 应用程序”**图标(在右上角),然后将新网站命名为“站点导航”。

  9. 单击**“打开”,然后单击“确定”**。

    Visual Web Developer 创建该网站并打开一个名为 Default.aspx 的新页。默认情况下,Visual Web Developer 创建的新页带有匹配的代码隐藏文件,在本例中为 Default.aspx.cs。在使用**“添加新项”**向导创建后续的新页时可以更改此行为。

    ms178429.alert_note(zh-cn,VS.90).gif说明:

    有时,如果在 Visual Web Developer 之前安装了以前版本的 .NET Framework,您可能会获得关于配置网站使用最新版本的 .NET Framework 的错误。为更正此错误,可以在出现的对话框上单击“是”,以便在服务器上启用 ASP.NET 2.0 版,或者,可以使用 IIS 管理器更正此错误。在 IIS 管理器中,右击应用程序,单击“属性”,然后单击“ASP.NET”选项卡。在“ASP.NET 版本”旁边,请选择随 Visual Web Developer 安装的 .NET Framework 版本。

启用成员资格和创建用户

如果还没有启用成员资格,请使用以下过程启用它。否则,请转到下一节。

启用成员资格

  1. 在 Visual Web Developer 中的**“网站”菜单上,单击“ASP.NET 配置”**。

    出现“网站管理工具”。

  2. 单击**“安全”选项卡,在“用户”之下单击“选择身份验证类型”,再单击“通过 Internet”,然后单击“完成”**。

    此选项指定应用程序将使用 Forms 身份验证,其中用户将使用在本演练中稍后创建的登录页登录到应用程序。

  3. 在**“安全”选项卡上单击“创建用户”**。

    下面将为应用程序创建两个用户帐户。

  4. 在**“创建用户”**框中,键入定义应用程序的用户的信息。请使用下面的值作为参考。可以使用自己喜欢的任何值,但是要确保记下该条目以供本演练稍后使用。

    • **用户名   **使用名称“Customer01”,这是第一个用户帐户的名称。

    • **密码   **使用自己选择的密码,最好是强密码,即至少包含八个字符并包含大写字母和小写字母以及标点符号的密码。

    • **电子邮件   **使用格式正确的电子邮件地址。也可以使用不存在的电子邮件地址,因为本演练不发送电子邮件。

    • **安全问题和安全答案   **键入可在以后需要恢复密码时使用的问题和答案。

  5. 选择**“活动用户”复选框,然后单击“创建用户”**。

  6. 在确认页上单击**“继续”**。

  7. 重复上面的三个步骤创建另外一个名为“Employee01”的用户帐户。(在为这些用户帐户创建角色时,将使用全部为小写字母的名称。)

  8. 单击该页右下角的**“上一步”按钮返回到“安全”**起始页。

创建用户登录页

若要测试将在本演练中稍后配置的成员资格和角色设置,需要为用户创建登录方法,以便能够标识他们。

为所有用户创建显示登录状态的默认页

  1. 打开 Default.aspx 页,然后切换到“设计”视图。

    如果没有 Default.aspx 页,请向网站的根目录添加一个 Default.aspx 页。

    ms178429.alert_note(zh-cn,VS.90).gif说明:

    确保将该页命名为 Default.aspx;此名称稍后将在本演练中使用。

  2. 在工具箱中,从**“登录”组中将“LoginStatus”**控件拖动到页上。

    如果用户尚未登录,LoginStatus 控件会自动将用户定向到 Login.aspx 页。

  3. 将光标放在 LoginStatus 控件右侧,按 Enter,然后键入以下内容,包括额外的空白:“Hello ”。

  4. 在工具箱中,从**“登录”组中将“LoginName”**控件拖动到页上。

    如果用户已登录,LoginName 控件将显示用户的名称。

  5. 保存该页,然后将其关闭。

现在您有了一个对所有用户可用的主页。下一步是创建一个简单的登录页。

创建登录页

  1. 向网站的根目录添加一个名为 Login.aspx 的页。

  2. 打开 Login.aspx 页,然后切换到“设计”视图。

  3. 在工具箱中,从**“登录”组中将“Login”**控件拖动到页上。

  4. 右击**“Login”控件,单击“属性”,然后将“DestinationPageUrl”设置为“Default.aspx”**。

  5. 保存该页,然后将其关闭。

为网站建立角色并将用户分配到建立的角色

在使用安全修整之前,必须设置用户角色。

启用角色

为了使安全修整工作,必须启用角色。

启用角色

  1. 在 Visual Web Developer 中的**“网站”菜单上,单击“ASP.NET 配置”**。

    出现“网站管理工具”。

  2. 单击**“安全”选项卡,然后单击“启用角色”**。

创建角色并将用户帐户分配到创建的角色

现在已启用了角色,但是在创建角色并将用户帐户分配到角色之前,您不能创建访问规则。

创建角色并分配用户帐户

  1. 如果网站管理工具未打开,请遵循如下步骤打开它:在 Visual Web Developer 中的**“网站”菜单上,单击“ASP.NET 配置”**。

    出现“网站管理工具”。

  2. 单击**“安全”选项卡,然后单击“创建或管理角色”**。

    下面将创建两个角色。

  3. 在**“创建新角色”框中,键入“customers”,然后单击“添加角色”**。

  4. 重复上面的步骤创建名为“employees”的角色。

  5. 在**“角色名称”框中,单击“customers”旁的“管理”**。

    此操作将打开一个页,您可在该页上从列表中选择要添加到**“customers”**角色的用户帐户。

  6. 在**“搜索用户”框中,单击“全部”**。

    这样将显示网站的所有用户帐户。如果列表太长,还可以按用户名的第一个字母搜索。

  7. 在用户名**“Customer01”旁边,选择“用户属于角色”**列中的框。

    用户 Customer01 现在成了 customers 角色的成员。

  8. 单击**“上一步”返回到“创建新角色”**页。

  9. 重复上面的两个步骤将用户 Employee01 添加到 employees 角色。

  10. 关闭 ASP.NET 应用程序管理页。

创建有选择地授予或拒绝对页的访问的规则

为了测试安全修整,需要为网站创建一些文件夹和页,然后设置这些文件夹和页上的安全权限。

创建用于本演练的必要的文件夹和页

网站将包含链接到一些页的站点地图结构,现在可以创建这些页。

创建必要的文件夹和页

  1. 在解决方案资源管理器中,右击网站的根目录,单击**“新建文件夹”**,然后将该文件夹命名为“EmployeesOnly”。

    EmployeesOnly 文件夹将包含一个仅对部分用户可访问的页。

  2. 右击网站的根目录,单击**“新建文件夹”**,然后将该文件夹命名为“Customers”。

    Customers 文件夹将包含一个仅对部分用户可访问的页。

  3. 在 EmployeesOnly 文件夹中,创建一个名为“Discounts.aspx”的新页。

  4. 在 Customers 文件夹中,创建一个名为“Support.aspx”的新页。

  5. 在网站的根目录中,创建名称分别为“Hardware.aspx”、“Software.aspx”、“Training.aspx”和“Consulting.aspx”的四个新页。

  6. 在已创建的每个新页中,切换到“设计”视图,键入页顶部的页标题,然后将该标题格式设置为**“<H1>”**,以便能够在浏览该页时对该页进行标识。

  7. 保存新页,然后关闭它们。

创建访问规则

正在创建的网站将允许用户根据他们的角色获得对不同页的访问。因此需要创建一些访问规则,确定哪些角色能够访问哪些文件夹。

为 EmployeesOnly 文件夹设置访问规则

  1. 在 Visual Web Developer 中的**“网站”菜单上,单击“ASP.NET 配置”**。

    出现“网站管理工具”。

  2. 在**“安全”选项卡上,单击“管理访问规则”,然后单击“添加新访问规则”。此操作将为您打开“添加新访问规则”**页。

  3. 在**“为此规则选择一个目录”下面,展开根节点,然后单击“EmployeesOnly”**。

  4. 在**“规则应用于”下面,单击“角色”,然后在该框中单击“employees”**。

  5. 在**“权限”之下选择“允许”**。

    所创建的规则将向 employees 角色中的所有用户授予对 EmployeesOnly 文件夹的访问权限。

  6. 单击**“确定”**。

    新规则显示在**“管理访问规则”**表中的网格中。当用户请求 EmployeesOnly 文件夹中的页时,将按顺序从上到下检查这些规则,以确定是否允许用户访问该页。如果用户不是 employees 角色的成员,则不会显示此文件夹中的页。

  7. 单击**“添加新访问规则”**链接。

  8. 在**“规则应用于”之下选择“所有用户”**。

  9. 在**“权限”之下选择“拒绝”,然后单击“确定”**。

    EmployeesOnly 文件夹的第二个规则确保除了 employees 角色中的用户外,其他任何用户都不能获得对该文件夹的访问。这些规则按照在该网格中的显示顺序从上到下进行处理。

    第一个规则(“允许”)向 employees 角色中的用户授予访问权限。第二个规则(“拒绝”)拒绝其他所有用户的访问权限。可以根据应用程序需要创建任意数目的“允许”和“拒绝”规则。当用户请求 EmployeesOnly 文件夹中的页时,将按顺序从上到下检查这些规则,以确定是否允许用户访问该页。

下一步针对 Customers 文件夹重复上面的过程。然而,customers 和 employees 角色都能用于获得对 Customers 文件夹的访问。作为实际方案的示例,可考虑存在一家公司,该公司希望其电话支持雇员对客户能够看到的相同页拥有访问权限。

为 Customers 文件夹设置访问规则

  1. 单击**“添加新访问规则”**链接。

  2. 在**“规则应用于”之下选择“角色”框,然后在该框中单击“customers”**。

  3. 在**“权限”之下选择“允许”,然后单击“确定”**。

    所创建的规则将向 customers 角色中的所有用户授予对 Customers 文件夹的访问权限。

  4. 在**“管理访问规则”之下单击“Customers”**。

  5. 单击**“添加新访问规则”**链接。

  6. 在**“规则应用于”之下选择“角色”框,然后在该框中单击“employees”**。

  7. 在**“权限”之下选择“允许”,然后单击“确定”**。

    所创建的规则也向 employees 角色中的所有用户授予对 Customers 文件夹的访问权限。

  8. 在**“管理访问规则”之下单击“Customers”**。

  9. 单击**“添加新访问规则”**链接。

  10. 在**“规则应用于”之下选择“所有用户”**框。

  11. 在**“权限”之下选择“拒绝”框,然后单击“确定”**。

    Customers 文件夹的第一和第二个规则确保除了在 customers 或 employees 角色中拥有帐户的用户外,其他任何用户都不能获得对 Customers 文件夹的访问。这些规则按照在该网格中的显示顺序从上到下进行处理。

    第一个规则(“允许”)向在成员角色中拥有帐户的用户授予访问权限。第二个规则(“拒绝”)拒绝其他所有用户的访问权限。可以根据应用程序需要创建任意数目的“允许”和“拒绝”规则。当用户请求 Customers 文件夹中的页时,将按顺序从上到下检查这些规则,以确定是否允许用户访问该页。

  12. 单击**“完成”返回到“安全”**选项卡。

创建站点地图并启用安全修整

在本演练的此部分,您将创建站点地图以描述网站的导航结构,然后通过编辑 Web.config 文件启用站点地图节点的安全修整。

创建站点地图

若要使用站点导航,您需要一种方式来描述站点中的页如何布局。默认方法是创建一个包含站点层次结构的 XML 文件,其中包含页标题和 URL。

每个页表示为站点地图中的一个 siteMapNode 元素。最上面的节点表示主页,子节点表示站点中更深层的页。

创建站点地图

  1. 在解决方案资源管理器中,右击网站的名称,然后单击**“添加新项”**。

  2. 在**“添加新项”**对话框中:

    1. 在**“Visual Studio 已安装的模板”之下单击“站点地图”**。

    2. 确保**“名称”**框中的名称为“Web.sitemap”。

      ms178429.alert_note(zh-cn,VS.90).gif说明:

      该文件必须命名为 Web.sitemap,并且必须位于网站的根目录中。

    3. 单击**“添加”**。

  3. 将下面的 XML 内容复制到 Web.sitemap 文件中,并重写该 XML 文件的默认内容。

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap>
      <siteMapNode title="Home" description="Home" 
           url="~/default.aspx" >
        <siteMapNode title="Products" 
             description="Our products" 
             roles="*">
          <siteMapNode title="Hardware" 
               description="Hardware we offer" 
               url="~/Hardware.aspx" />
          <siteMapNode title="Software" 
               description="Software for sale" 
               url="~/Software.aspx" />
          <siteMapNode title="Discounts" 
               description="Employee Discounts" 
               url="~/EmployeesOnly/Discounts.aspx" />
        </siteMapNode>
        <siteMapNode title="Services" 
             description="Services we offer" 
             roles="*">
          <siteMapNode title="Training" 
               description="Training" 
               url="~/Training.aspx" />
          <siteMapNode title="Consulting" 
               description="Consulting" 
               url="~/Consulting.aspx" />
          <siteMapNode title="Support" 
               description="Support" 
               url="~/Customers/Support.aspx" />
        </siteMapNode>
      </siteMapNode>
    </siteMap>
    

    Web.sitemap 文件包含一组三层嵌套的 siteMapNode 元素。每个元素的结构相同;它们之间的唯一区别是其在 XML 层次结构中的位置。

    该示例 XML 文件中定义的页的 URL 是非限定的,意味着所有页都将被视为具有相对于应用程序根目录的 URL。然而,您可以为给定的页指定任何 URL——站点地图中定义的逻辑结构不必对应于文件夹中的页的物理布局。

    站点地图中仅有两个节点上设置了 roles 属性:Products 和 Services。这两个节点没有 url 属性。ASP.NET 使用 .aspx 页的访问规则验证站点地图节点是否应该对用户可见。在没有 url 属性的情况下,如果启用安全修整,则没有用户能够查看该页。将 roles 属性设置为星号 (*) 或通配符可将访问扩展到所有人。

  4. 保存文件,然后将其关闭。

启用安全性调整

所创建的站点地图使用默认站点地图提供程序 XmlSiteMapProvider。由于这个原因,Web.config 文件不需要包含 siteMap 元素(ASP.NET 设置架构)元素,因为 ASP.NET 具有用于默认站点地图的内部配置。但是,安全修整默认是未启用的,因此必须设置 siteMap 元素(ASP.NET 设置架构)元素。

启用安全修整

  1. 在 Visual Web Developer 中,右击网站的根目录,然后单击**“刷新文件夹”**。

    此操作将使 Web.config 文件显示在解决方案资源管理器中。通过选择**“添加新项”或使用“ASP.NET 配置”**工具可以创建 Web.config 文件,就像我们在本演练中前面所做的那样。

  2. 打开 Web.config 文件。

  3. 查找 siteMap 元素(ASP.NET 设置架构)元素,以防它已经存在。

    如果 siteMap 元素(ASP.NET 设置架构)元素不存在,请将下面的代码粘贴到 system.web 元素(ASP.NET 设置架构)元素内,小心不要将它粘贴到其他任何元素内。

    <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
      <providers>
        <add name="XmlSiteMapProvider"
          description="Default SiteMap provider."
          type="System.Web.XmlSiteMapProvider"
          siteMapFile="Web.sitemap"
          securityTrimmingEnabled="true" />
      </providers>
    </siteMap>
    
  4. 保存并关闭 Web.config 文件。

安全性调整功能对每个请求使用 URL 授权,以确定用户是否能访问与 siteMapNode 元素关联的 URL。这种额外的工作会使性能下降,下降的程度取决于要进行授权的节点的数目。如果启用了安全性调整,您可以使用下面的方法提高性能:

  • 限制站点地图文件中的节点数   节点数超过 150 的站点地图文件执行安全性调整操作所耗费的时间明显变长。

  • 显式设置 siteMapNode 元素上的角色属性   注意,应对可安全显示给任何客户端的节点将 roles 属性设置为星号 (*)。当用户属于 roles 属性中列出的某一角色时,使用该属性后,ASP.NET 可避开与 siteMapNode 关联的 URL 的 URL 授权限制。

在页上创建导航菜单

现在您有了一个站点地图和一些页,接下来可向站点添加导航。

使用 SiteMapPath 或 Menu 控件也可以显示站点导航。有关更多信息,请参见 ASP.NET 导航控件演练:向网站添加站点导航

使用 TreeView 控件创建导航菜单

您将使用 TreeView 控件作为可折叠的导航菜单。

添加导航菜单

  1. 打开 Default.aspx 页,然后切换到“设计”视图。

  2. 在工具箱中,从**“数据”组中将“SiteMapDataSource”**控件拖动到页上。

    在默认配置中,SiteMapDataSource 控件从前面创建的 Web.sitemap 文件获取信息,因此不需要为该控件指定任何附加信息。

  3. 在工具箱中,从**“导航”组中将“TreeView”**控件拖动到页上。

    出现**“TreeView 任务”**菜单。

  4. 在**“TreeView 任务”菜单上,在“选择数据源”框中单击“SiteMapDataSource1”**。

  5. 保存页。

使用 SiteMapPath 控件创建导航菜单

您将使用 SiteMapPath 控件作为面包屑样式的导航显示,向用户显示返回根页的路径。

添加导航菜单

  1. 打开 Hardware.aspx 页,然后切换到“设计”视图。

    若要演示 SiteMapPath 控件如何工作,请将该控件放在一个深层嵌套的页上。

  2. 如果在此页上的 <H1> 标记内添加了标题,请将光标放在右侧并按 Enter。

  3. 在工具箱中,从**“导航”组中将“SiteMapPath”**控件拖动到页上。

    出现**“SiteMapPath 任务”**菜单,但是不需要配置数据源。

  4. 保存页。

测试安全修整

现在可以对站点进行测试了。

测试安全修整

  1. 切换到**“Default.aspx”**页,然后按 Ctrl+F5 运行该页。

    在 TreeView 控件中,您应当看不到**“Discounts”“Support”**链接。

  2. 单击**“Login”**。

  3. 作为“Customer01”登录(这是 customers 角色中的一个用户帐户)。

    在 TreeView 控件中,您现在应该看得到**“Support”**链接。

  4. 单击**“Logout”,然后单击“Login”**。

  5. 作为“Employee01”登录(这是 employees 角色中的一个用户帐户)。

    在 TreeView 控件中,您现在应该看得到**“Discounts”链接和“Support”**链接。作为雇员,您应该看得到所有可用的链接,因为其中没有任何链接对雇员是受限制的。

  6. 在 Default.aspx 页上,单击**“Hardware”**,以便能够看到 SiteMapPath 控件。

    SiteMapPath 控件应该显示从主页到“Hardware”页的路径。

在该网站的当前状态下,导航树只出现在主页上。可以向应用程序中的每个页添加相同的 SiteMapDataSource 和 TreeView 控件,以便在每个页上都显示导航菜单。或者,可以将导航树放在母版页上,以便它自动出现引用母版页文件的每个页上。

后续步骤

本演练演示了 ASP.NET 站点导航的基本功能:导航控件、角色管理和安全修整。您可能还想试验导航的其他功能。例如,您可能想要将导航控件放在母版页中,以便它们出现在引用母版页的所有页上。有关详细信息,请参见演练:在 Visual Web Developer 中创建和使用 ASP.NET 母版页

请参见

任务

演练:向网站添加站点导航

概念

ASP.NET 站点导航概述

ASP.NET 站点地图安全性调整

保证 ASP.NET 站点导航的安全

保证数据访问的安全

创建自己的代码访问权限

其他资源

寄宿环境中的 ASP.NET 应用程序安全性