.NET 生产环境中的基于角色的安全






4.18/5 (7投票s)
编辑 web.config 以更新共享托管中使用基于角色的安全的数据提供程序:SQL Server、ODBC、Active Directory、ADAM、SQLite、MySQL、Access、XML
引言
本文介绍了如何在共享托管服务器上使用远程 SQL Server 2005 数据库,使基于角色的安全适用于 .NET 2.0 应用程序。
许多人问过这样的问题:“我的 ASP 应用程序使用基于角色的安全,并且在我的‘localhost’上的 SQL Server 2005 Express 中运行良好。如何在共享托管环境的生产服务器上实现这一点?”
在开发环境和生产环境中实现 .NET 基于角色的安全 Web 应用程序存在差异。在阅读了许多关于新手不理解实现过程的抱怨后,我决定写这篇文章。因此,本文将提及一些在将应用程序从开发计算机迁移到生产环境时需要注意的几点。
特定数据提供程序及其相应的代码示例在本文的 数据提供程序实现 部分和 参考资料 部分提供了链接。
背景
从 Microsoft .NET 2.0 Framework 开始,ASP.NET Web 应用程序的基于角色的访问由两个文件中的内容控制:
web.config
文件ASP.NET 架构
文件
一旦这两个文件配置正确,就可以使用 表单身份验证 来创建安全的 Web 应用程序。
在使用其开发环境中的 Visual Web Developer
(VWD) 时,这两个文件会自动配置为与 Cassini Web 服务器和本地 SQL Server 2005 Express 实例在 localhost
上使用。
将应用程序部署到生产环境时,必须将默认数据提供程序从 SQL Server 2005 Express 更改。并且,必须将默认的 ASP.NET 架构
文件移植到数据库文件类型,以便在 Web 主机的生产环境中使用。移植 ASP.NET 架构
文件然后需要编辑 web.config
文件以使用该文件及其关联的远程数据服务器。
web.config 文件
除其他用途外,web.config
文件还用于限制对 ASP.NET 网站目录(文件夹)的访问。在 VWD 开发环境中,可以使用 ASP.NET 网站管理工具 为应用程序的 Web 文件夹创建访问规则。此工具通过自动编辑 web.config
文件来更新应用程序的所有访问规则,从而轻松设置和配置基于角色的安全 Web 应用程序。
此外,web.config
用于声明要用于 ASP.NET 架构
文件的哪个数据提供程序。必须为数据提供程序声明数据库类型和连接字符串。
将应用程序部署到生产环境时,无法使用 ASP.NET 网站管理工具。并且必须使用 Visual Web Developer 手动编辑 web.config
文件。
ASP.NET 架构文件
ASP.NET 架构
文件(Schema)是一个数据库文件,其中包含与 IIS 或 Cassini Web 服务器兼容的数据架构、表、视图和存储过程。兼容性意味着 Schema 必须满足 ASP.NET 所需的规范,例如…… Schema 具有特定命名的表,并具有预定义的表定义,以及创建和访问数据的方法。
Schema 用于标识用户、定义个性化首选项、定义用户角色以及声明用户在已定义用户角色中的成员身份。
对于 SQL Server 数据提供程序,VWD 可以使用 ASP.NET 网站管理工具自动生成 Schema。或者,如果 Web 主机允许使用,则可以使用其他工具,例如 ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe) 或 SQL Server 数据库发布向导 来创建 Schema。
对于自定义数据提供程序,开发人员必须创建一个脚本来生成 Schema。此类脚本的示例可在以下自定义提供程序的链接中找到。
数据部署问题
默认情况下,在 VWD 开发环境中创建的 Schema 是 Microsoft SQL Server 2005 Express 数据库文件 ASPNETDB.MDF
,该文件位于 Web 应用程序的 App_Data 文件夹中。该文件由 SQL Server 2005 Express 的本地实例访问。Cassini Web 服务器在此默认场景下运行良好。
在生产环境中,至少有三个原因不使用默认的 Schema 部署场景:
- 在 IIS Web 服务器上,ASP.NET 仅识别一个 App_Data 文件夹;即位于 Web 服务器根目录中的那个。并且通常不允许访问 App_Data 文件夹,尤其是在共享托管环境中。(想象一下数百个网站试图共享同一个 Schema 文件。虽然在某个奇怪的宇宙中,可能可以为服务器上的每个托管网站拥有相同的用户、角色和成员资格访问规则集。但在现实世界中,这种情况不太可能。)
- SQL Server 2005 Express 未设计用于生产环境,并且由于内存管理问题,在生产服务器上不受支持。
- 在生产环境中,使用远程数据库而不是 SQL Server 2005 Express 的本地用户实例。本地,指的是数据库服务器与 Web 服务器安装在同一台计算机上。远程,指的是数据库服务器与 Web 服务器未安装在同一台计算机上。
数据部署问题的解决方案
一个简单的解决方案是让 Web 服务器使用远程数据库服务器。在该远程数据库服务器上,为每个具有基于角色的访问的 Web 网站存在一个唯一命名的数据库 Schema。然后,ASP.NET 可以根据任何给定 Web 网站特有的访问规则,为每个 Web 网站实现基于角色的访问。
虽然 SQL Server 2005 Express 在生产环境中不受支持,但可以使用其他数据提供程序来处理 Schema。选择 Web 主机支持的数据提供程序。
更改默认数据提供程序后,必须在应用程序的 web.config
文件中声明 Schema 的数据提供程序;然后必须保存 web.config
文件。应暂时将应用程序下线,然后重新上线,以便数据提供程序的更改生效。
数据提供程序实现
得益于 ODBC
和 OLEDB
技术,可以为 .NET Web 服务器可以访问的几乎任何数据库创建 自定义数据提供程序。Schema 的数据提供程序可能包括:
- SQL Server 2005 Express(默认提供程序)
- SQL Server 2005(本文的范围)
- SQL Server 2000
- ODBC
- Active Directory(或 Active Directory)
- ADAM
- MySQL(或 MySQL)
- SQLite
- Microsoft Access
- 只读 XML 文件(不创建用户,不更新密码)
Using the Code
虽然有大量材料用于实现该问题的解决方案,但很少有能完全涵盖该主题的。主要是因为代码示例只显示了设置 web.config
文件所需的编辑的片段。
此代码示例包括 web.config
文件的完整脚本。这是我 Web 应用程序使用的 web.config
文件。特定的名称已被更改,但内容是有效的。只需用您的具体信息替换我代码示例中泛化的具体信息。
配置是针对远程 SQL Server 2005 数据库的。 对于此示例:
远程数据服务器:THEREMOTESERVERURL(例如,71.05.26.41)
Schema 文件:THESCHEMA(上传到数据服务器的 SQL Server 2005 数据文件)(例如,wafflehut)
数据库用户名:THEUSERNAME(例如,whodatis)
数据库密码:THEPASSWORD(例如,slaphappy)
web.config
<?xml version="1.0"?> <!-- Please refer to machine.config.comments for a description and the default values of each configuration section. For a full documentation of the schema please refer to "%22%22%22http://go.microsoft.com/fwlink/?LinkId=42127"""">http://go.microsoft.com/fwlink/?LinkId=42127 To improve performance, machine.config should contain only those settings that differ from their defaults. --> <configuration> <connectionStrings> <remove name="LocalSqlServer" /> <add name="LocalSqlServer" connectionString="Data Source=THEREMOTESERVERURL;Initial Catalog=THESCHEMA;User Id=THEUSERNAME;Password=THEPASSWORD;" /> <add name="SqlProviderConnection" connectionString="Data Source=THEREMOTESERVERURL;Initial Catalog=THESCHEMA;User Id=THEUSERNAME;Password=THEPASSWORD;" /> </connectionStrings> <system.web> <authentication mode="Forms" /> <compilation defaultLanguage="c#" urlLinePragmas="true" debug="false" /> <membership defaultProvider="AspNetSqlMembershipProvider"> <providers> <remove name="AspNetSqlMembershipProvider" /> <add connectionStringName="LocalSqlServer" name="AspNetSqlMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" requiresQuestionAndAnswer="true" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </providers> </membership> <roleManager enabled="true" > <providers> <remove name="AspNetSqlRoleProvider" /> <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </providers> </roleManager> <customErrors mode="Off" /> </system.web> </configuration>
注意:为清晰起见,应用程序的连接字符串和其他配置数据以纯文本形式呈现。一旦应用程序正常运行,请务必通过遵循以下链接中概述的行业公认安全措施来保护应用程序的 web.config 文件:DPAPI 和 Triple DES:保护连接字符串和其他应用程序设置的强大组合
摘要
在 Visual Web Developer IDE 中,默认部署方案在创建、测试和调试 Web 应用程序方面效果很好。ASP.NET 网站管理工具 (WSA) 会自动创建正确的 web.config 文件设置,用于 Web 文件夹访问规则。WSA 还会创建和更新默认的 Schema 文件 ASPNETDB.MDF。但是,此设置仅在开发环境中有效。
将最终完成的应用程序迁移到生产环境时,必须进行更改。所需的更改包括:
- 在远程数据库服务器上创建一个空白数据库。必须为 Web 应用程序访问数据时使用的用户名和密码。Web 主机提供商可以提供有关如何访问远程数据库服务器以创建新数据库的详细信息。Web 主机提供商还可以帮助识别用于访问新数据库的正确 connectionString。
- 将 ASP.NET Schema 脚本化到新数据库。Web 主机提供商可以协助完成此步骤的最佳方法。一些提供商允许使用工具,例如 ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe)。其他 Web 主机提供商则简单地让开发人员将开发数据文件 FTP 到 Web 文件夹,然后使用还原功能来填充远程数据库服务器上的空白数据库文件。
- 将应用程序的目录和 ASPX 文件上传到生产 Web 服务器。但不要上传 App_Data 文件夹及其内容。
- 修改应用程序的 web.config 文件,以更改 Schema 的 connectionString 属性。它必须指向远程数据库服务器和应用程序特定的 Schema 数据文件。还必须指定其他 connectionString 属性,例如身份验证类型(表单身份验证)、用户名和密码。
- 修改应用程序的 web.config 文件以更新 membership 和 roleManager 提供程序。必须首先删除默认提供程序,然后添加。删除步骤会消除默认的 SQL Server 2005 Express 提供程序。添加步骤必须紧跟删除步骤,它会添加新的数据提供程序。
- 完成上述步骤后;重新生成、保存并测试 Web 应用程序。它现在应该能很好地支持基于角色的安全功能。
参考文献
参考 - 代码示例
ASPNet101.com. (ASP.Net 教程 - 带有远程数据库(非 SQL Express)的成员资格/角色) 的 connectionStrings 和 membership 部分。检索自 http://aspnet101.com/aspnet101/tutorials.aspx?id=63 ,2008 年 5 月 19 日。
edba1970 (博客贡献者)。2007 年 11 月 29 日。(WEB.CONFIG 中 SQL Server 2005 的连接字符串) 的 roleManager 部分。检索自 http://forums.asp.net/p/1008091/2324843.aspx,2008 年 5 月 19 日。
Guthrie, Scott. 2005 年 8 月 25 日。ScottGu 的博客。配置 ASP.NET 2.0 应用程序服务以使用 SQL Server 2000 或 SQL Server 2005。检索自 http://weblogs.asp.net/scottgu/archive/2005/08/25/423703.aspx,2008 年 5 月 19 日。
Arafa, Moustafa. 2006 年 11 月 22 日。将 ASP.NET 2 网站部署到生产服务器:第 II 部分。检索自 http://www.vbdotnetheaven.com/UploadFile/dsdaf/111212006224845PM/1.aspx,2008 年 5 月 19 日。
Allen, Scott. 2005 年 11 月 25 日。.NET 成员资格和角色提供程序在 ASP.NET 2.0 第 I 部分。检索自 http://odetocode.com/Articles/427.aspx,2008 年 5 月 19 日。
参考 - .NET 安全性
Foulds, Hannes. 2005 年 8 月 26 日。DPAPI 和 Triple DES:保护连接字符串和其他应用程序设置的强大组合。检索自 https://secure.codeproject.com/KB/aspnet/dapi.aspx,2008 年 5 月 19 日。
参考 - 工具和实用程序
Microsoft Corporation. 2008。提供程序工具包。检索自 http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2008。ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe)。.NET Framework 工具,ASP.NET Framework 3.5。检索自 http://msdn.microsoft.com/en-us/library/ms229862.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2007 年 4 月 6 日。Microsoft SQL Server 数据库发布向导 1.1。DatabasePublishingWizard.msi 检索自 http://www.microsoft.com/downloads/details.aspx?familyid=56E5B1C5-BF17-42E0-A410-371A838E570A,2008 年 5 月 19 日。
参考 - .NET 基于角色的安全
Burman, Dan. 2005 年 3 月。使用 Visual Web Developer 2005 Express Edition 和 SQL Server 2005 Express Edition 进行 Web 开发,第一部分。SQL Server 2005 Express Edition 技术文章。检索自 http://msdn.microsoft.com/en-us/library/ms345152.aspx,2008 年 5 月 19 日。Microsoft Corporation。
Stewart, Heath. 2003 年 6 月 17 日。使用表单身份验证实现基于角色的安全。检索自 formsroleauth.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2008。成员资格简介。ASP.NET Framework 3.5。检索自 http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2005 年 8 月。成员资格提供程序。ASP.NET 技术文章。检索自 http://msdn.microsoft.com/en-us/library/aa479031.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2005 年 10 月。ASP.NET 2.0 提供程序模型:提供程序模型简介。ASP.NET 技术文章。检索自 http://msdn.microsoft.com/en-us/library/aa479030.aspx,2008 年 5 月 19 日。
参考 - 数据提供程序代码示例
Andriniaina, Rakotomalala. 2005 年 12 月 20 日。MySQL 的成员资格和角色提供程序。检索自 https://codeproject.org.cn/KB/database/mysqlmembershipprovider.aspx,2008 年 5 月 19 日。
Bromberg, Peter A. SQLite 3.0 成员资格和角色提供程序用于 ASP.NET 2.0。检索自 http://www.eggheadcafe.com/articles/20051119.asp,2008 年 5 月 19 日。
Snyman, Jacques. 2007 年 10 月 22 日。ASP.NET 2.0 的 MySQL 提供程序实现套件。检索自 https://codeproject.org.cn/KB/webforms/MySQLsuite.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2008。如何:示例 (ODBC) 成员资格提供程序实现。ASP.NET Framework 3.5。检索自 http://msdn.microsoft.com/en-us/library/6tc47t75.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2008。示例 (MS Access) 成员资格提供程序实现。ASP.NET Framework 3.5。检索自 http://msdn.microsoft.com/en-us/library/44w5aswa.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2008。ActiveDirectoryMembershipProvider 类 (.NET 3.5)。.NET Framework 类库。检索自 http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2005 年 8 月。如何:在 ASP.NET 2.0 中使用 Active Directory 实现表单身份验证。.NET 安全。检索自 http://msdn.microsoft.com/en-us/library/ms998360.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2005 年 8 月。如何:在 ASP.NET 2.0 中为角色使用 ADAM。.NET 安全。检索自 http://msdn.microsoft.com/en-us/library/ms998331.aspx,2008 年 5 月 19 日。
Microsoft Corporation. 2005 年 8 月。如何:在 ASP.NET 2.0 中将表单身份验证与 SQL Server (2000) 结合使用。.NET 安全。检索自 http://msdn.microsoft.com/en-us/library/ms998317.aspx,2008 年 5 月 19 日。