创建和管理角色 (VB)

作者 :Scott Mitchell

注意

自本文撰写以来,ASP.NET 成员资格提供程序已被 ASP.NET Identity 取代。 强烈建议更新应用以使用 ASP.NET 标识 平台,而不是本文撰写时提供的成员资格提供程序。 与 ASP.NET 成员身份系统 ASP.NET 标识具有许多优势,包括:

  • 性能更好
  • 改进了扩展性和可测试性
  • 支持 OAuth、OpenID Connect 和双因素身份验证
  • 基于声明的标识支持
  • 与 ASP.Net Core 更好的互操作性

下载代码下载 PDF

本教程介绍配置角色框架所需的步骤。 之后,我们将生成用于创建和删除角色的网页。

简介

基于用户的授权 教程中,我们介绍了如何使用 URL 授权来限制一组页面中的某些用户,并探索了基于访问用户调整 ASP.NET 页面功能的声明性和编程技术。 但是,在用户帐户很多或用户权限经常更改的情况下,授予页面访问权限或功能的权限可能会成为维护噩梦。 每当用户获得或失去执行特定任务的授权时,管理员都需要更新相应的 URL 授权规则、声明性标记和代码。

它通常有助于将用户分类为组或 角色 ,然后按角色应用权限。 例如,大多数 Web 应用程序都有一组仅供管理用户保留的页面或任务。 使用 基于用户的授权 教程中学习的技术,我们将添加相应的 URL 授权规则、声明性标记和代码,以允许指定的用户帐户执行管理任务。 但是,如果添加了新管理员,或者现有管理员需要吊销她的管理权限,则必须返回并更新配置文件和网页。 但是,对于角色,我们可以创建一个名为“管理员”的角色,并将这些受信任的用户分配到“管理员”角色。 接下来,我们将添加相应的 URL 授权规则、声明性标记和代码,以允许管理员角色执行各种管理任务。 建立此基础结构后,将新管理员添加到站点或删除现有管理员就像在管理员角色中包括或删除用户一样简单。 无需配置、声明性标记或代码更改。

ASP.NET 提供了用于定义角色并将其与用户帐户关联的角色框架。 使用角色框架,我们可以创建和删除角色、向角色添加用户或从中删除用户、确定属于特定角色的用户集,以及判断用户是否属于特定角色。 配置角色框架后,我们可以通过 URL 授权规则来逐角色限制对页面的访问,并根据当前登录用户的角色在页面上显示或隐藏其他信息或功能。

本教程介绍配置角色框架所需的步骤。 之后,我们将生成用于创建和删除角色的网页。 在向用户分配角色教程中,我们将了解如何在角色中添加和删除用户。 在基于角色授权教程中,我们将了解如何按角色限制对页面的访问,以及如何根据访问用户的角色调整页面功能。 让我们开始吧!

步骤 1:添加新 ASP.NET 页

在本教程和接下来的两个教程中,我们将研究各种与角色相关的功能和功能。 我们需要一系列 ASP.NET 页面来实现这些教程中介绍的主题。 让我们创建这些页面并更新站点地图。

首先,在名为 Roles的项目中创建一个新文件夹。 接下来,将四个新的 ASP.NET 页添加到 Roles 文件夹,将每个页面与 Site.master 母版页链接。 为页面命名:

  • ManageRoles.aspx
  • UsersAndRoles.aspx
  • CreateUserWizardWithRoles.aspx
  • RoleBasedAuthorization.aspx

此时,项目的解决方案资源管理器应类似于图 1 所示的屏幕截图。

已向 Roles 文件夹添加了四个新页面

图 1:已向 Roles 文件夹添加了四个新页面 (单击以查看全尺寸图像)

此时,每个页面应具有两个 Content 控件,一个用于母版页的 ContentPlaceHolders: MainContentLoginContent

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent" Runat="Server"> 
</asp:Content>

回想一下, LoginContent ContentPlaceHolder 的默认标记显示用于登录或注销网站的链接,具体取决于用户是否经过身份验证。 但是,在 ASP.NET 页中存在 Content2 Content 控件会替代母版页的默认标记。 正如我们在表单身份验证概述教程中所述,重写默认标记对于我们不希望在左列中显示登录相关选项的页面很有用。

但是,对于这四个页面,我们希望显示 ContentPlaceHolder 的母版页的默认标记 LoginContent 。 因此,请删除 Content 控件的 Content2 声明性标记。 执行此操作后,四个页面的标记中的每一个应只包含一个 Content 控件。

最后,让我们更新站点地图 (Web.sitemap) 以包含这些新网页。 在为成员资格教程添加的 之后 <siteMapNode> 添加以下 XML。

<siteMapNode title="Roles"> 
 <siteMapNode url="~/Roles/ManageRoles.aspx" title="Manage Roles" />
 <siteMapNode url="~/Roles/UsersAndRoles.aspx" title="Users and Roles" />
 <siteMapNode url="~/Roles/CreateUserWizardWithRoles.aspx" title="Create Account (with Roles)"/>
 <siteMapNode url="~/Roles/RoleBasedAuthorization.aspx" title="Role-Based Authorization" />
</siteMapNode>

更新站点地图后,通过浏览器访问站点。 如图 2 所示,左侧的导航现在包含角色教程的项。

左侧的导航现在包括角色教程的项。

图 2:已向 Roles 文件夹添加了四个新页面 (单击以查看全尺寸图像)

步骤 2:指定和配置角色框架提供程序

与成员资格框架一样,角色框架是在提供程序模型之上构建的。 如安全基础知识和 ASP.NET 支持教程中所述,.NET Framework附带三个内置角色提供程序:AuthorizationStoreRoleProviderWindowsTokenRoleProviderSqlRoleProvider。 本教程系列重点介绍 SqlRoleProvider使用 Microsoft SQL Server 数据库作为角色存储的 。

在 下,涵盖角色框架,其 SqlRoleProvider 工作原理与成员资格框架和 SqlMembershipProvider类似。 .NET Framework包含一个Roles类,该类充当角色框架的 API。 类Roles具有共享方法,如 CreateRoleDeleteRoleGetAllRolesAddUserToRoleIsUserInRole、 等。 调用其中一种方法时,类会将 Roles 调用委托给配置的提供程序。 适用于 SqlRoleProvider 特定于角色的表, aspnet_Roles (并 aspnet_UsersInRoles) 响应。

若要在应用程序中使用该 SqlRoleProvider 提供程序,需要指定用作存储的数据库。 要求 SqlRoleProvider 指定的角色存储具有特定的数据库表、视图和存储过程。 可以使用 工具添加aspnet_regsql.exe这些必需的数据库对象。 此时,我们已经有了一个数据库,其中包含 所需的架构 SqlRoleProvider回到在 SQL Server 中创建成员资格架构教程中,我们创建了一个名为 SecurityTutorials.mdf 的数据库,用于aspnet_regsql.exe添加应用程序服务,其中包括 所需的SqlRoleProvider数据库对象。 因此,我们只需告知角色框架启用角色支持,并将 SqlRoleProvider 与数据库一起使用 SecurityTutorials.mdf 作为角色存储。

角色框架是通过 <roleManager> 应用程序文件中的 Web.config 元素配置的。 默认情况下,角色支持处于禁用状态。 若要启用它,必须将元素的 enabled 属性设置为<roleManager>true,如下所示:

<?xml version="1.0"?>
<configuration>
 <system.web>
 ... Additional configuration markup removed for brevity ... 

 <roleManager enabled="true" />
 <system.web>
</configuration>

默认情况下,所有 Web 应用程序都具有类型为 的SqlRoleProvider名为 AspNetSqlRoleProvider 的角色提供程序。 此默认提供程序在 machine.config 位于 %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG) 的 (中注册:

<roleManager>
 <providers>
 <add name="AspNetSqlRoleProvider"
 connectionStringName="LocalSqlServer"
 applicationName="/"
 type="System.Web.Security.SqlRoleProvider,
 System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
 </providers>
</roleManager>

提供程序的 connectionStringName 属性指定使用的角色存储。 提供程序AspNetSqlRoleProvider将此属性设置为 LocalSqlServer,默认情况下,该属性在 和 点中machine.config也定义为 文件夹中名为 aspnet.mdf的 SQL Server 2005 Express Edition 数据库App_Data

因此,如果只是启用角色框架而不在应用程序的 Web.config 文件中指定任何提供程序信息,则应用程序将使用默认注册的角色提供程序 AspNetSqlRoleProvider~/App_Data/aspnet.mdf如果数据库不存在,ASP.NET 运行时将自动创建它并添加应用程序服务架构。 但是,我们不想使用 aspnet.mdf 数据库;而是要使用 SecurityTutorials.mdf 已创建并添加了应用程序服务架构的数据库。 可以通过以下两种方式之一完成此修改:

将以下角色配置标记添加到 Web.config 文件。 此标记注册名为 的新提供程序 SecurityTutorialsSqlRoleProvider.

<?xml version="1.0"?>
<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString"
 connectionString="..."/>
 </connectionStrings>

 <system.web>
 ... Additional configuration markup removed for brevity ...

 &nbsp &nbsp<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
 &nbsp &nbsp &nbsp<providers>
 <add name="SecurityTutorialsSqlRoleProvider"
 type="System.Web.Security.SqlRoleProvider"
 applicationName="SecurityTutorials"
 connectionStringName="SecurityTutorialsConnectionString"/>
 </providers>
 </roleManager>
 <system.web>
</configuration>

上述标记通过 defaultProvider 元素) 中的 <roleManager> 属性将 定义为SecurityTutorialsSqlRoleProvider默认提供程序 (。 它还将 SecurityTutorialsSqlRoleProviderapplicationName 设置为 SecurityTutorials,这是成员资格提供程序 (SecurityTutorialsSqlMembershipProvider) 使用的相同applicationName设置。 虽然此处未显示,<add>但 的 SqlRoleProvider 元素可能还包含一个commandTimeout属性,用于指定数据库超时持续时间(以秒为单位)。 默认值为 30。

有了此配置标记,我们就可以开始在应用程序中使用角色功能了。

注意

上述配置标记说明了如何使用 <roleManager> 元素的 enableddefaultProvider 属性。 还有许多其他属性会影响角色框架如何逐个用户关联角色信息。 我们将在基于角色的授权教程中检查这些设置。

步骤 3:检查角色 API

角色框架的功能通过 Roles公开,该类包含 13 个用于执行基于角色的操作的共享方法。 在步骤 4 和 6 中查看创建和删除角色时,我们将使用 CreateRoleDeleteRole 方法,用于在系统中添加或删除角色。

若要获取系统中所有角色的列表,请使用 GetAllRoles 方法 (请参阅步骤 5) 。 方法RoleExists返回一个布尔值,该值指示是否存在指定的角色。

在下一教程中,我们将探讨如何将用户与角色关联。 类 RolesAddUserToRoleAddUserToRolesAddUsersToRoleAddUsersToRoles 方法将一个或多个用户添加到一个或多个角色。 若要从角色中删除用户,请使用 RemoveUserFromRoleRemoveUserFromRolesRemoveUsersFromRoleRemoveUsersFromRoles 方法。

基于角色授权教程中,我们将探讨如何根据当前登录用户的角色以编程方式显示或隐藏功能。 为此,可以使用 Role 类的 FindUsersInRoleGetRolesForUserGetUsersInRoleIsUserInRole 方法。

注意

请记住,每当调用其中一种方法时,类会将 Roles 调用委托给配置的提供程序。 在本例中,这意味着调用将发送到 SqlRoleProviderSqlRoleProvider然后,根据调用的方法执行相应的数据库操作。 例如,代码 Roles.CreateRole("Administrators") 导致 SqlRoleProvider 执行 aspnet_Roles_CreateRole 存储过程,这将在名为 Administrators 的表中插入一条新记录 aspnet_Roles

本教程的其余部分介绍如何使用 Roles 类的 CreateRoleGetAllRolesDeleteRole 方法来管理系统中的角色。

步骤 4:创建新角色

角色提供了一种任意分组用户的方法,最常见的是,此分组用于更方便地应用授权规则。 但是,若要将角色用作授权机制,我们首先需要定义应用程序中存在的角色。 遗憾的是,ASP.NET 不包含 CreateRoleWizard 控件。 为了添加新角色,我们需要创建一个合适的用户界面,并自行调用角色 API。 好消息是,这很容易实现。

注意

虽然没有 CreateRoleWizard Web 控件,但有 ASP.NET 网站管理工具,这是一个本地 ASP.NET 应用程序,旨在帮助查看和管理 Web 应用程序的配置。 但是,出于两个原因,我不是 ASP.NET 网站管理工具的忠实粉丝。 首先,它有点错误,用户体验还有很多需要。 其次,ASP.NET 网站管理工具设计为仅在本地工作,这意味着如果需要远程管理实时站点上的角色,则必须构建自己的角色管理网页。 出于这两个原因,本教程和下一篇教程将重点介绍如何在网页中构建必要的角色管理工具,而不是依赖于 ASP.NET 网站管理工具。

ManageRoles.aspx打开 文件夹中的页面,Roles并将 TextBox 和 Button Web 控件添加到页面。 将 TextBox 控件的 ID 属性分别设置为 RoleName ,将 Button 的 IDText 属性分别设置为 CreateRoleButton 和 创建角色。 此时,页面的声明性标记应如下所示:

<b>Create a New Role:</b>
<asp:TextBox ID="RoleName" runat="server"></asp:TextBox>
<br />
<asp:Button ID="CreateRoleButton" runat="server" Text="Create Role" />

接下来,双击CreateRoleButtonDesigner中的 Button 控件以创建Click事件处理程序,然后添加以下代码:

Protected Sub CreateRoleButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)
 End If

 RoleName.Text= String.Empty 
End Sub

上述代码首先将 TextBox 中 RoleName 输入的修整角色名称分配给 变量 newRoleName 。 接下来, Roles 调用 类的 RoleExists 方法以确定系统中是否已存在该角色 newRoleName 。 如果该角色不存在,则通过调用 CreateRole 方法创建该角色。 如果向 CreateRole 方法传递系统中已存在的角色名称, ProviderException 则会引发异常。 这就是代码在调用 CreateRole之前首先检查以确保系统中不存在该角色的原因。 事件处理程序 Click 通过清除 RoleName TextBox 的 Text 属性结束。

注意

你可能想知道,如果用户未在 TextBox 中输入任何值 RoleName ,会发生什么情况。 如果传递到 方法Nothing中的CreateRole值为或空字符串,则会引发异常。 同样,如果角色名称包含逗号,则会引发异常。 因此,页面应包含验证控件,以确保用户输入角色且不包含任何逗号。 我离开为读者做练习。

让我们创建一个名为“管理员”的角色。 ManageRoles.aspx通过浏览器访问页面,在文本框中键入“管理员” (请参阅图 3) ,然后单击“创建角色”按钮。

创建管理员角色

图 3:创建管理员角色 (单击以查看全尺寸映像)

发生什么情况? 发生回发,但没有视觉提示表明角色实际上已添加到系统中。 我们将在步骤 5 中更新此页面,以包含视觉反馈。 但是,现在,可以通过转到 SecurityTutorials.mdf 数据库并显示表中的数据 aspnet_Roles 来验证是否已创建角色。 如图 4 所示, aspnet_Roles 该表包含刚添加的管理员角色的记录。

aspnet_Roles表有一个行供管理员使用

图 4:表中 aspnet_Roles 有一个行供管理员 (单击以查看全尺寸图像)

步骤 5:在系统中显示角色

让我们扩充页面, ManageRoles.aspx 以包含系统中当前角色的列表。 为此,请将 GridView 控件添加到页面,并将其 ID 属性设置为 RoleList。 接下来,使用以下代码将 方法添加到名为 DisplayRolesInGrid 的页面的代码隐藏类:

Private Sub DisplayRolesInGrid()
 RoleList.DataSource = Roles.GetAllRoles()
 RoleList.DataBind()
End Sub

RolesGetAllRoles 方法以字符串数组的形式返回系统中的所有角色。 然后,此字符串数组将绑定到 GridView。 为了在首次加载页面时将角色列表绑定到 GridView,我们需要从页面的Page_Load事件处理程序调用 DisplayRolesInGrid 方法。 以下代码在首次访问页面时调用此方法,但不会在后续回发时调用此方法。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 If Not Page.IsPostBack Then
 DisplayRolesInGrid()
 End If 
End Sub

完成此代码后,通过浏览器访问页面。 如图 5 所示,应会看到一个网格,其中单个列标记为“项”。 网格包含我们在步骤 4 中添加的管理员角色的一行。

GridView 在单个列中显示角色

图 5:GridView 在单个列中显示角色 (单击以查看全尺寸图像)

GridView 显示标记为 Item 的单独列,因为 GridView 的属性 AutoGenerateColumns 设置为 True (默认) ,这会导致 GridView 为其 中的每个 DataSource属性自动创建一个列。 数组具有表示数组中的元素的单个属性,因此 GridView 中的单个列。

使用 GridView 显示数据时,我更喜欢显式定义列,而不是让 GridView 隐式生成列。 通过显式定义列,可以更轻松地设置数据格式、重新排列列和执行其他常见任务。 因此,让我们更新 GridView 的声明性标记,以便显式定义其列。

首先,将 GridView 的 AutoGenerateColumns 属性设置为 False。 接下来,将 TemplateField 添加到网格,将其 HeaderText 属性设置为 Roles,并对其进行配置 ItemTemplate ,以便显示数组的内容。 为此,请将名为 的 RoleNameLabel 标签 Web 控件添加到 , ItemTemplate 并将其 Text 属性绑定到 Container.DataItem.

可以通过声明方式或通过 GridView 的“字段”对话框和“编辑模板”界面设置这些属性 ItemTemplate和 的内容。 若要访问“字段”对话框,请单击 GridView 的智能标记中的“编辑列”链接。 接下来,取消选中“自动生成字段”复选框,将 AutoGenerateColumns 属性设置为 False,并将 TemplateField 添加到 GridView,将其 HeaderText 属性设置为 Role。 若要定义 ItemTemplate的内容,请从 GridView 的智能标记中选择“编辑模板”选项。 将 Label Web 控件拖到 上 ItemTemplate,将其 ID 属性设置为 RoleNameLabel,并配置其数据绑定设置,使其 Text 属性绑定到 Container.DataItem

无论使用哪种方法,完成后,GridView 生成的声明性标记都应如下所示。

<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="false">
 <Columns>
 <asp:TemplateField HeaderText="Role">
 <ItemTemplate>
 <asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
 </ItemTemplate>
 </asp:TemplateField>
 </Columns>
</asp:GridView>

注意

数组的内容使用数据绑定语法 <%# Container.DataItem %>显示。 有关显示绑定到 GridView 的数组内容时为何使用此语法的完整说明超出了本教程的范围。 有关此问题的详细信息,请参阅将 标量数组绑定到数据 Web 控件

目前, RoleList GridView 仅在首次访问页面时绑定到角色列表。 每当添加新角色时,都需要刷新网格。 为此,请更新 CreateRoleButton Button 的 Click 事件处理程序,以便在创建新角色时调用 DisplayRolesInGrid 方法。

Protected Sub CreateRoleButton_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)

 ' Refresh the RoleList Grid
 DisplayRolesInGrid()
 End If

 RoleName.Text = String.Empty 
End Sub

现在,当用户添加新角色时,GridView 会在 RoleList 回发时显示刚刚添加的角色,从而提供角色已成功创建的视觉反馈。 若要说明这一点,请通过浏览器访问 ManageRoles.aspx 页面,并添加名为“主管”的角色。 单击“创建角色”按钮后,将进行回发,网格将更新为包括管理员以及新角色“主管”。

已添加监督员角色

图 6:已添加主管角色 (单击以查看全尺寸图像)

步骤 6:删除角色

此时,用户可以创建新角色并从页面查看所有现有角色 ManageRoles.aspx 。 还允许用户删除角色。 方法 Roles.DeleteRole 有两个重载:

  • DeleteRole(roleName) - 删除角色 roleName。 如果角色包含一个或多个成员,则会引发异常。
  • DeleteRole(roleName, throwOnPopulatedRole) - 删除角色 roleName。 如果 throwOnPopulateRoleTrue,则如果角色包含一个或多个成员,则会引发异常。 如果 throwOnPopulateRoleFalse,则无论角色是否包含任何成员,都将删除该角色。 在内部, DeleteRole(roleName) 方法调用 DeleteRole(roleName, True)

如果 roleNameNothing 或为空字符串,或者 roleName 包含逗号,则DeleteRole方法也会引发异常。 如果 系统中不存在 roleName ,则 DeleteRole 以无提示方式失败,不会引发异常。

让我们在 中 ManageRoles.aspx 增加 GridView,以包含一个“删除”按钮,单击该按钮会删除所选角色。 首先,通过转到“字段”对话框并添加位于 CommandField 选项下的“删除”按钮,将“删除”按钮添加到 GridView。 将“删除”按钮设置为最左侧的列,并将其 DeleteText 属性设置为“删除角色”。

向 RoleList GridView 添加删除按钮

图 7:将“删除”按钮添加到 RoleList GridView (单击以查看全尺寸图像)

添加“删除”按钮后,GridView 的声明性标记应如下所示:

<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="False">
 <Columns>
 <asp:CommandField DeleteText="Delete Role" ShowDeleteButton="True" />
 <asp:TemplateField HeaderText="Role">
 <ItemTemplate>
 <asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
 </ItemTemplate>
 </asp:TemplateField>
 </Columns> 
</asp:GridView>

接下来,为 GridView 的事件 RowDeleting 创建事件处理程序。 这是单击“删除角色”按钮时回发时引发的事件。 将以下代码添加到该事件处理程序中。

Protected Sub RoleList_RowDeleting(ByVal sender As Object,ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles RoleList.RowDeleting
 ' Get the RoleNameLabel
 Dim RoleNameLabel As Label = CType(RoleList.Rows(e.RowIndex).FindControl("RoleNameLabel"),Label)

 ' Delete the role
 Roles.DeleteRole(RoleNameLabel.Text,False)

 ' Rebind the data to the RoleList grid
 DisplayRolesInGrid()
End Sub

代码首先以编程方式引用 RoleNameLabel 单击了“删除角色”按钮的行中的 Web 控件。 Roles.DeleteRole然后调用 方法,传入 TextFalseRoleNameLabel ,从而删除角色,而不管是否有任何用户与该角色相关联。 最后, RoleList 将刷新 GridView,以便刚删除的角色不再显示在网格中。

注意

删除角色按钮在删除角色之前不需要用户进行任何形式的确认。 确认操作的最简单方法之一是通过客户端确认对话框。 有关此方法的详细信息,请参阅 在删除时添加Client-Side确认

摘要

许多 Web 应用程序具有某些授权规则或页面级功能,这些规则或功能仅适用于某些类别的用户。 例如,可能有一组只有管理员才能访问的网页。 通常,基于角色定义规则更有用,而不是逐个用户定义这些授权规则。 也就是说,一种更易维护的方法不是显式允许用户 Scott 和 Jisun 访问管理网页,而是允许管理员角色的成员访问这些页面,然后将 Scott 和 Jisun 表示为属于管理员角色的用户。

使用角色框架可以轻松创建和管理角色。 在本教程中,我们介绍了如何将角色框架配置为使用 SqlRoleProvider,该框架使用 Microsoft SQL Server 数据库作为角色存储。 我们还创建了一个网页,其中列出了系统中的现有角色,并允许创建新角色和删除现有角色。 在后续教程中,我们将了解如何将用户分配到角色以及如何应用基于角色的授权。

编程快乐!

深入阅读

有关本教程中讨论的主题的详细信息,请参阅以下资源:

关于作者

Scott Mitchell 是多本 ASP/ASP.NET 书籍的作者和 4GuysFromRolla.com 的创始人,自 1998 年以来一直从事 Microsoft Web 技术工作。 Scott 担任独立顾问、培训师和作家。 他的最新一本书是 山姆斯在 24 小时内 ASP.NET 2.0。 可以在 上联系 mitchell@4guysfromrolla.com 斯科特,也可以通过他的博客在 联系 http://ScottOnWriting.NET

特别感谢

本教程系列由许多有用的审阅者审阅。 本教程的首席审阅者包括 Alicja Maziarz、Suchi Banerjee 和 Teresa Murphy。 有兴趣查看我即将发布的 MSDN 文章? 如果是这样,请在 mitchell@4GuysFromRolla.com