生产网站上的用户和角色 (C#)
注意
自本文撰写以来,ASP.NET 成员资格提供程序已被 ASP.NET Identity 取代。 强烈建议更新应用以使用 ASP.NET 标识 平台,而不是本文撰写时提供的成员资格提供程序。 与 ASP.NET 成员身份系统 ASP.NET 标识具有许多优势,包括:
- 性能更好
- 改进了扩展性和可测试性
- 支持 OAuth、OpenID Connect 和双因素身份验证
- 基于声明的标识支持
- 与 ASP.Net Core 更好的互操作性
ASP.NET 网站管理工具 (WSAT) 提供基于 Web 的用户界面,用于配置成员身份和角色设置以及创建、编辑和删除用户和角色。 遗憾的是,WSAT 仅在从 localhost 访问时才有效,这意味着无法通过浏览器访问生产网站的管理工具。 好消息是,有一些解决方法可以管理生产中的用户和角色。 本教程介绍这些解决方法和其他解决方法。
简介
ASP.NET 2.0 引入了许多 应用程序服务,这些服务是一套可添加到 Web 应用程序的构建基块服务。 我们在 配置使用应用程序服务的网站 教程中将成员资格和角色服务添加到了书籍评论网站。 成员资格服务有助于创建和管理用户帐户;角色服务提供用于将用户分类为组的 API。 书籍评论网站有三个用户帐户(Scott、Jisun 和 Alice),以及一个角色(管理员),其中 Scott 和 Jisun 处于管理员角色。
Asp。NET 的应用程序服务不绑定到特定的实现。 相反,你可以指示应用程序服务使用特定的 提供程序,并且该提供程序使用特定技术实现该服务。 我们已将书评 Web 应用程序配置为将 SqlMembershipProvider
和 SqlRoleProvider
提供程序用于成员资格和角色服务。 这两个提供程序将用户帐户和角色信息存储在SQL Server数据库中,是 Web 托管公司托管的基于 Internet 的 Web 应用程序的最常用的提供程序。
使用成员身份和角色服务的开发人员面临的一个常见挑战是管理生产环境中的用户和角色。 如何从生产网站中删除用户帐户、添加新角色或将现有用户添加到现有角色? 本教程探讨在生产网站上管理用户和角色的不同方法。
使用 ASP.NET 网站管理工具
ASP.NET 包括网站 管理工具 (WSAT) ,使创建和管理用户帐户和角色以及指定基于用户和角色的授权规则变得简单。 若要使用 WSAT,请单击解决方案资源管理器中的“ASP.NET 配置”图标,或转到“网站或项目”菜单并选择“ASP.NET 配置”选项。 任一方法都启动 Web 浏览器,并将其指向 WSAT 的地址,如下所示: http://localhost:portNumber/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=pathToApplication
WSAT 分为三个部分:
- 安全性 - 管理用户、角色和授权规则。
- ApplicationConfiguration - 在此处管理 <appSettings> 和 SMTP 设置。 还可以使应用程序脱机,并从此处管理调试和跟踪设置,并指定默认的自定义错误页。
- ProviderConfiguration - 配置应用程序服务使用的提供程序。
图 1 中显示的“安全性”部分 () 包含用于创建新用户、管理用户、创建和管理角色以及创建和管理访问规则的链接。 在此处,你可以向系统添加新角色、删除现有用户,或者从特定用户帐户添加或删除角色。
图 1:WSAT 安全部分包括用于管理用户和角色的选项
(单击以查看全尺寸图像)
遗憾的是,WSAT 只能在本地访问。 无法在远程生产网站上访问 WSAT;如果访问 www.yoursite.com/asp.netwebadminfiles/default.aspx
,则会收到“404 未找到”响应。 支持 WSAT 的代码使用 Membership
.NET Framework 中的 和 Roles
类来创建、编辑和删除用户和角色。 这些类会查阅 Web 应用程序的配置信息以确定要使用的提供程序;在 配置使用应用程序服务的网站 教程 中,我们将书籍评论网站设置为使用 SqlMembershipProvider
和 SqlRoleProvider
提供程序。 这需要向 添加 <membership>
和 <roleManager>
部分 Web.config
。
<?xml version="1.0"?>
<configuration>
...
<connectionStrings configSource="ConfigSections\databaseConnectionStrings.config" />
<system.web>
...
<membership defaultProvider="ReviewMembership">
<providers>
<clear />
<add type="System.Web.Security.SqlMembershipProvider"
name="ReviewMembership"
connectionStringName="ReviewsConnectionString"
applicationName="BookReviews" />
</providers>
</membership>
<roleManager enabled="true" defaultProvider="ReviewRole">
<providers>
<clear />
<add type="System.Web.Security.SqlRoleProvider"
name="ReviewRole"
connectionStringName="ReviewsConnectionString"
applicationName="BookReviews" />
</providers>
</roleManager>
</system.web>
...
</configuration>
请注意, <membership>
和 <roleManager>
部分在其属性中type
分别引用 SqlMembershipProvider
和 SqlRoleProvider
提供程序。 这些提供程序将用户和角色信息存储在指定的SQL Server数据库中。 这些提供程序使用的数据库由 connectionStringName
在 文件中定义的 ~/ConfigSections/databaseConnectionStrings.config
属性 ReviewsConnectionString
指定。 回想一下, databaseConnectionStrings.config
开发环境中的文件包含开发数据库的连接字符串, databaseConnectionStrings.config
而生产环境中的文件包含生产数据库的连接字符串。
简而言之,必须通过开发环境在本地访问 WSAT,并且它适用于文件中指定的 databaseConnectionStrings.config
数据库中的用户和角色信息。 因此,如果我们更改开发环境中的 文件中的连接字符串信息 databaseConnectionStrings.config
,则可以在本地使用 WSAT 来管理生产环境中的用户和角色。
若要说明此功能,请在 databaseConnectionStrings.config
开发环境中的 Visual Studio 中打开 文件,并将开发数据库连接字符串替换为生产数据库连接字符串。 然后启动 WSAT,转到“安全”选项卡,并添加一个名为 Sam 的新用户,其中包含密码“password!” (少引号) 。 图 2 显示了创建此帐户时的 WSAT 屏幕。
图 2:在生产环境中创建名为 Sam 的新用户
(单击以查看全尺寸图像)
由于我们更改了 中的 databaseConnectionStrings.config
连接字符串以指向生产数据库服务器,因此 Sam 已添加为生产环境中的用户。 若要验证这一点,请将文件中的 databaseConnectionStrings.config
连接字符串更改回开发数据库, Login.aspx
然后访问开发环境中的页面。 尝试登录时 Sam (请参阅 图 3) 。
图 3:无法在开发环境中以 Sam 身份登录
(单击以查看全尺寸图像)
无法在开发环境中以 Sam 身份登录,因为本地数据库中不存在用户帐户信息。 而是已将 添加到生产数据库。 若要验证这一点,请在开发和生产数据库中查看表的内容 aspnet_Users
。 在开发环境中,用户 Scott、Jisun 和 Alice 应只有三条记录。 但是,生产数据库中的 aspnet_Users
表有四条记录:Scott、Jisun、Alice 和 Sam。 因此,Sam 可以通过生产环境中的网站登录,但不能通过开发环境登录。
图 4:Sam 可以在生产网站上登录
(单击以查看全尺寸图像)
注意
使用完 WSAT 后,不要忘记将文件中的连接字符串 databaseConnectionStrings.config
更改回开发数据库的连接字符串,否则在通过开发环境测试站点时,将使用生产数据。 另请记住,虽然我们刚才讨论的技术允许我们使用 WSAT 远程管理用户和角色,但对任何其他 WSAT 配置选项的更改 (访问规则、SMTP 设置、调试和跟踪设置等) 修改 Web.config
文件。 因此,对设置所做的任何更改都适用于开发环境,而不是生产环境。
创建自定义用户和角色管理网页
WSAT 提供用于管理用户和角色的现成系统,但只能在本地启动,并且需要更改连接字符串信息,以便在生产环境中管理用户和角色。 大多数支持用户帐户的网站还包括许多用户和角色管理网页,使管理员能够从网站中的页面管理用户和角色。 此类基于 Web 的管理页面使管理用户和角色更加容易,对于可能有许多管理员或管理员无权访问的网站或使用 Visual Studio 启动 WSAT 的技术背景至关重要。
ASP.NET 包含许多与登录相关的内置 Web 控件,这些控件使实现其中许多管理网页变得像拖放一样简单。 例如,可以通过将 CreateUserWizard 控件拖到页面上并设置一些属性,为管理员创建一个页面,以便创建新用户帐户。 事实上, 用于在图 2 所示的 WSAT 中创建用户的页面使用可添加到页面的同一 CreateUserWizard 控件。 此外,成员资格和角色服务的功能通过 Membership
.NET Framework 中的 和 Roles
类以编程方式提供。 借助这些类,可以编写代码来创建、编辑和删除用户和角色,以及向角色添加或删除用户、确定哪些用户处于哪些角色,以及执行与用户和角色相关的其他任务。
在 “配置使用应用程序服务的网站” 教程 中,我向 Admin
名为 CreateAccount.aspx
的文件夹添加了一个页面。 此页面允许管理员向站点添加新用户帐户,并指定新创建的用户是否为管理员角色, (请参阅图 5) 。
图 5:管理员可以创建新的用户帐户
(单击以查看全尺寸图像)
有关生成用户和角色管理页面的更详细内容,以及有关使用 Membership
和 Roles
类和登录相关 ASP.NET Web 控件的分步说明,请务必阅读我的 网站安全性教程。 你将在此处找到有关如何生成网页的指南,用于创建新帐户、创建和管理角色、将用户分配到角色以及其他常见管理任务。
若要在生产网站上实现类似于 WSAT 的功能,始终可以构建自己的一系列实现 WSAT 功能的网页。 为了帮助入门,检查 WSAT 源代码,它位于 文件夹 %WINDIR%\Microsoft.NET\Framework\v2.0.50727\ASP.NETWebAdminFiles
。 另一种选择是使用 Dan Clem 的 WSAT 替代方法,他在文章《滚动自己的网站管理工具》中分享了该选项。 Dan 指导读者完成生成类似 WSAT 的自定义工具的过程,包括应用程序的源代码,用于在 C#) 中下载 (,并提供将自定义 WSAT 添加到托管网站的分步说明。
摘要
ASP.NET 网站管理工具 (WSAT) 可以与成员资格和角色应用程序服务结合使用,以管理网站的用户和角色信息。 遗憾的是,WSAT 只能在本地访问,不能从生产网站访问。 但是,通过将开发环境中的连接字符串更改为指向生产数据库,可以使用 WSAT 管理生产网站上的用户和角色。
虽然 WSAT 方法提供了一种快速而简单的方法来管理用户和角色,但它需要从 Visual Studio 启动 WSAT 以及对连接字符串信息进行临时更改。 WSAT 提供了一种在生产环境中管理用户和角色的快速方法,但很麻烦,不适用于具有多个管理员的网站或不熟悉 Visual Studio 和 WSAT 的管理员。 出于这些原因,大多数支持用户帐户的网站都包含一组管理网页。 这样一组网页无需 WSAT,并且由各种管理用户从任何计算机使用。
编程快乐!
深入阅读
有关本教程中讨论的主题的详细信息,请参阅以下资源:
- 检查 ASP。NET 的成员身份、角色和配置文件
- 滚动自己的网站管理工具
- 网站管理工具概述
- 网站安全教程