创建和管理角色 (C#)
注意
自本文撰写以来,ASP.NET 成员资格提供程序已被 ASP.NET Identity 取代。 强烈建议更新应用以使用 ASP.NET 标识 平台,而不是本文撰写时介绍的成员资格提供程序。 ASP.NET 标识比 ASP.NET 成员身份系统具有许多优势,包括:
- 性能更好
- 改进了可扩展性和可测试性
- 支持 OAuth、OpenID Connect 和双因素身份验证
- 基于声明的标识支持
- 更好地与 ASP.Net Core 的互操作性
本教程介绍配置角色框架所需的步骤。 然后,我们将生成网页来创建和删除角色。
简介
在 基于用户的授权 教程中,我们了解了如何使用 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 中所示的屏幕截图。
图 1:已将四个新页面添加到 Roles
文件夹 (单击以查看全尺寸图像)
此时,每个页面应具有两个 Content 控件,每个母版页的 ContentPlaceHolders 各对应一个: MainContent
和 LoginContent
。
<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附带三个内置角色提供程序:AuthorizationStoreRoleProvider
、 WindowsTokenRoleProvider
和 SqlRoleProvider
。 本教程系列重点介绍 SqlRoleProvider
使用 Microsoft SQL Server 数据库作为角色存储的 。
在 下方,涵盖角色框架,其 SqlRoleProvider
工作原理与成员资格框架和 SqlMembershipProvider
类似。 .NET Framework包含一个Roles
类,该类充当角色框架的 API。 类Roles
具有静态方法,如 CreateRole
、DeleteRole
、GetAllRoles
AddUserToRole
、IsUserInRole
、 等。 调用其中一种方法时, 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 应用程序都具有名为 AspNetSqlRoleProvider
类型 SqlRoleProvider
的角色提供程序。 此默认提供程序在 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
的App_Data
文件夹中的SQL Server 2005 Express Edition数据库。
因此,如果只是启用角色框架,而不在应用程序的 Web.config
文件中指定任何提供程序信息,则应用程序将使用默认注册的角色提供程序 AspNetSqlRoleProvider
。 ~/App_Data/aspnet.mdf
如果数据库不存在,ASP.NET 运行时会自动创建它并添加应用程序服务架构。 但是,我们不想使用 aspnet.mdf
数据库;而是要使用 SecurityTutorials.mdf
已创建并将应用程序服务架构添加到的数据库。 可以通过以下两种方式之一完成此修改:
- 为
LocalSqlServer
指定值中的Web.config
连接字符串名称.通过覆盖LocalSqlServer
中的Web.config
连接字符串名称值,可以使用默认注册的角色提供程序 (AspNetSqlRoleProvider
) ,并使其在数据库中正确使用SecurityTutorials.mdf
。 有关此技术的详细信息,请参阅 Scott Guthrie 的博客文章配置 ASP.NET 2.0 应用程序服务以使用 SQL Server 2000 或 SQL Server 2005。 - 添加类型
SqlRoleProvider
为 的新注册提供程序并配置connectionStringName
设置为指向SecurityTutorials.mdf
数据库。这是我在 SQL Server 中创建成员资格架构教程中推荐和使用的方法,也是本教程中使用的方法。
将以下角色配置标记添加到 Web.config
文件。 此标记注册名为 SecurityTutorialsSqlRoleProvider
的新提供程序。
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString"
connectionString="..."/>
</connectionStrings>
<system.web>
... Additional configuration markup removed for brevity ...
<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
<providers>
<add name="SecurityTutorialsSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
applicationName="SecurityTutorials"
connectionStringName="SecurityTutorialsConnectionString" />
</providers>
</roleManager>
<system.web>
</configuration>
上述标记通过 defaultProvider
元素) 中的 <roleManager>
属性将 定义为SecurityTutorialsSqlRoleProvider
默认提供程序 (。 它还将 SecurityTutorialsSqlRoleProvider
的 设置设置为 SecurityTutorials
,这是成员资格提供程序 (SecurityTutorialsSqlMembershipProvider
) 使用的相同applicationName
设置。applicationName
虽然此处未显示,<add>
但 的 SqlRoleProvider
元素可能还包含一个commandTimeout
属性,用于指定数据库超时持续时间(以秒为单位)。 默认值为 30。
有了此配置标记,我们就可以开始在应用程序中使用角色功能了。
注意
上述配置标记演示了如何使用 <roleManager
> 元素的 enabled
和 defaultProvider
属性。 还有许多其他属性会影响角色框架如何根据用户关联角色信息。 我们将在基于角色的授权教程中检查这些设置。
步骤 3:检查角色 API
角色框架的功能通过 Roles
类公开,该类包含 13 个用于执行基于角色的操作的静态方法。 在步骤 4 和 6 中查看创建和删除角色时,我们将使用 CreateRole
和 DeleteRole
方法,这些方法在系统中添加或删除角色。
若要获取系统中所有角色的列表,请使用 GetAllRoles
方法 (请参阅步骤 5) 。 方法RoleExists
返回一个布尔值,该值指示是否存在指定的角色。
在下一教程中,我们将了解如何将用户与角色相关联。 类 Roles
的 AddUserToRole
、 AddUserToRoles
、 AddUsersToRole
和 AddUsersToRoles
方法将一个或多个用户添加到一个或多个角色。 若要从角色中删除用户,请使用 RemoveUserFromRole
、 RemoveUserFromRoles
、 RemoveUsersFromRole
或 RemoveUsersFromRoles
方法。
在基于角色的授权教程中,我们将了解基于当前登录用户角色以编程方式显示或隐藏功能的方法。 为此,可以使用 Role
类的 FindUsersInRole
、 GetRolesForUser
、 GetUsersInRole
或 IsUserInRole
方法。
注意
请记住,每当调用其中一个方法时,类会将 Roles
调用委托给配置的提供程序。 在本例中,这意味着调用将发送到 SqlRoleProvider
。 然后,根据 SqlRoleProvider
调用的方法执行相应的数据库操作。 例如,该代码 Roles.CreateRole("Administrators")
导致 SqlRoleProvider
执行 aspnet_Roles_CreateRole
存储过程,这会在名为 Administrators 的 aspnet_Roles
表中插入新记录。
本教程的其余部分介绍如何使用 Roles
类的 CreateRole
、 GetAllRoles
和 DeleteRole
方法来管理系统中的角色。
步骤 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 的 ID
和 Text
属性分别设置为 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" />
接下来,双击CreateRoleButton
Designer中的 Button 控件以创建Click
事件处理程序,然后添加以下代码:
protected void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
// Create the role
Roles.CreateRole(newRoleName);
RoleName.Text = string.Empty;
}
上述代码首先将 TextBox 中 RoleName
输入的剪裁的角色名称分配给 变量 newRoleName
。 接下来, Roles
调用 类的 RoleExists
方法,以确定系统中是否已存在该角色 newRoleName
。 如果该角色不存在,则通过调用 CreateRole
方法创建该角色。 如果向 CreateRole
该方法传递系统中已存在的角色名称, ProviderException
则会引发异常。 这就是代码在调用 CreateRole
之前首先检查以确保系统中不存在该角色的原因。 事件处理程序 Click
最后会清除 RoleName
TextBox 的 Text
属性。
注意
你可能想知道,如果用户未在 TextBox 中输入任何值 RoleName
,会发生什么情况。 如果传入方法null
的CreateRole
值为 或空字符串,则会引发异常。 同样,如果角色名称包含逗号,则会引发异常。 因此,页面应包含验证控件,以确保用户输入角色且不包含任何逗号。 我离开为读者做练习。
让我们创建一个名为“管理员”的角色。 ManageRoles.aspx
通过浏览器访问页面,在文本框中键入“管理员” (请参阅图 3) ,然后单击“创建角色”按钮。
图 3:创建管理员角色 (单击以查看全尺寸映像)
发生什么情况? 发生回发,但没有任何视觉提示表明该角色实际上已添加到系统中。 我们将在步骤 5 中更新此页面,以包含视觉反馈。 但是,现在可以通过转到 SecurityTutorials.mdf
数据库并显示表中的数据 aspnet_Roles
来验证是否已创建角色。 如图 4 所示,该 aspnet_Roles
表包含刚添加的管理员角色的记录。
图 4:表中 aspnet_Roles
有一个行供管理员 (单击以查看全尺寸图像)
步骤 5:在系统中显示角色
让我们扩充页面, ManageRoles.aspx
以包含系统中当前角色的列表。 为此,请将 GridView 控件添加到页面,并将其 ID
属性设置为 RoleList
。 接下来,使用以下代码将方法添加到名为 DisplayRolesInGrid
的页面的代码隐藏类:
private void DisplayRolesInGrid()
{
RoleList.DataSource = Roles.GetAllRoles();
RoleList.DataBind();
}
类 Roles
的 GetAllRoles
方法以字符串数组的形式返回系统中的所有角色。 然后,此字符串数组将绑定到 GridView。 为了在首次加载页面时将角色列表绑定到 GridView,我们需要从页面的 Page_Load
事件处理程序调用 DisplayRolesInGrid
方法。 以下代码在首次访问页面时调用此方法,但不会在后续回发时调用此方法。
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
DisplayRolesInGrid();
}
完成此代码后,通过浏览器访问页面。 如图 5 所示,应会看到一个网格,其中单列标记为 Item。 网格包含我们在步骤 4 中添加的管理员角色的行。
图 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 的智能标记中选择“编辑模板”选项。 将标签 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 void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
{
// Create the role
Roles.CreateRole(newRoleName);
// Refresh the RoleList Grid
DisplayRolesInGrid();
}
RoleName.Text = string.Empty;
}
现在,当用户添加新角色时,GridView 会在 RoleList
回发时显示刚添加的角色,并提供已成功创建角色的视觉反馈。 为了说明这一点,请通过浏览器访问 ManageRoles.aspx
页面,并添加名为 Supervisors 的角色。 单击“创建角色”按钮后,将发生回发,网格将更新为包括“管理员”以及新角色“监督者”。
图 6:已添加监督者角色 (单击以查看全尺寸图像)
步骤 6:删除角色
此时,用户可以创建新角色并从页面查看所有现有角色 ManageRoles.aspx
。 还允许用户删除角色。 方法 Roles.DeleteRole
有两个重载:
DeleteRole(roleName)
- 删除角色 roleName。 如果角色包含一个或多个成员,则会引发异常。DeleteRole(roleName, throwOnPopulatedRole)
- 删除角色 roleName。 如果 throwOnPopulateRole 为true
,则如果角色包含一个或多个成员,则会引发异常。 如果 throwOnPopulateRole 为false
,则无论角色是否包含任何成员,都将删除该角色。 在内部,DeleteRole(roleName)
方法调用DeleteRole(roleName, true)
。
如果 roleName 为 null
或为空字符串,或者 roleName 包含逗号,则DeleteRole
方法也会引发异常。 如果 系统中不存在 roleName ,则 DeleteRole
以无提示方式失败,不会引发异常。
让我们在 中 ManageRoles.aspx
增加 GridView,以包含一个“删除”按钮,单击该按钮会删除所选角色。 首先,通过转到“字段”对话框并添加位于 CommandField 选项下的“删除”按钮,将“删除”按钮添加到 GridView。 将“删除”按钮设置为最左侧的列,并将其 DeleteText
属性设置为“删除角色”。
图 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 void RoleList_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
// Get the RoleNameLabel
Label RoleNameLabel = RoleList.Rows[e.RowIndex].FindControl("RoleNameLabel") as Label;
// Delete the role
Roles.DeleteRole(RoleNameLabel.Text, false);
// Rebind the data to the RoleList grid
DisplayRolesInGrid();
}
代码首先以编程方式引用 RoleNameLabel
单击了“删除角色”按钮的行中的 Web 控件。 Roles.DeleteRole
然后调用 方法,传入 Text
和 false
的 RoleNameLabel
,从而删除角色,而不管是否有任何用户与该角色相关联。 最后, 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