考察 ASP.NET 2.0的Membership, Roles, and Profile - Part 3

本文英文原版与代码下载:
http://aspnet.4guysfromrolla.com/articles/040506-1.aspx


考察 ASP.NET 2.0的Membership, Roles, and Profile - Part 3


导言:

默认情况下,ASP.NET使用的membership 和 roles 分别使用的是SqlMembershipProvider 和 SqlRoleProvider.它们将membership和roles信息存储在一个SQL Server数据库里. 具体来说,信息存储在一个预先定义好了的表里,并可以通过一些预定义的存储过程来进行访问.为了在你的应用程序里通过默认的provider来使用membership 或 roles,我们需要将这些预定义的构造应用到你的应用程序里.

如果你没有数据库,还好ASP.NET可以在App_Data文件夹里创建一个SQL Server 2005 Express版本的数据库以包含必需的数据结构(schema).开发者经常要面对这种情况——手动将ASP.NET 2.0的 membership和roles特性添加到一个现有的数据模式(data model)。比如,你的应用程序目前还不支持membership 或 roles services,但是需要网站的某些部分对认证用户可见;或对属于某种角色的用户限制其功能.这时,我们一个通过the ASP.NET SQL Server注册工具(aspnet_regsql.exe)使一个现有的数据库支持membership 和 roles.

在本文,我们将考察如何用该工具对SqlMembershipProvider 好 SqlRoleProvider providers应用membership 和 roles services.该工具可以通过命令行或图形界面来运行.另外,我们还将看如何对App_Data文件夹里的现有的SQL Server 2005 Express数据库运用该工具.

如Part 1所述,使用ASP.NET Website管理工具(AWAT)可以在App_Data文件夹里创建一个名为ASPNETDB.MDF的数据库.有可能有这种网站,其有2个数据库,一个是ASPNETDB.MDF数据库,一个是应用程序自己使用的数据库.当涉及到与membership和roles有关的查询时,比如验证用户的身份,或创建一个新的用户帐户等,就使用ASPNETDB.MDF数据库;而网站页面依然使用原来的数据库.下面的图阐明了这种关系.

 


                      图1

最理想的是将与membership相关的数据结构(schema),转移到应用程序现有的数据库,所有的查询都要使用现有的数据库.如下图:

                       图2


不过,我们一定要这么做吗?为什么不能使用2个数据库,一个处理membership services另一个处理现有程序的工作?然而不管怎么样我依然建议将这2者合并起来.

打个比方,设想你有一个相薄程序,目前只有你才能添加相片。你可以运用ASP.NET 2.0的 membership功能,只允许认证用户才能访问该图片,另外,你还可以为你或你的配偶创建1到2个用户帐户。在这种情况,将membership schema添加到现有的数据库是比较理想的.另外,如果你允许访问者创建自己的帐户,并对图片发表评论的话,你可以在现有数据库创建一个Comments表,该表引用aspnet_Users表的一个外键,以便显示是那个人发表的评论.

将Membership相关的Schema应用到一个现有的数据库

要完成这个工作,使用ASP.NET SQL Server注册工具(aspnet_regsql.exe)是很容易办到的.在命令行里导航到%WINDOWS%/Microsoft.NET/Framework/v2.0.50727,再运行aspnet_regsql.exe这将开启ASP.NET SQL Server Setup Wizard向导,在向导里你要么为application services配置一个SQL Server数据库(也就是添加membership相关的schema),要么从数据库转移出schema,如下图:


                           图3


在接下来的界面,你要选择一个数据库来添加或(转移入)与membership相关的schema.如下图:

                             图4

指定了数据库后,点Next预览将要做的改动,预览完后点Next完成schema的配置。这将为membership providers添加必要的表、视图、存储过程.

ASP.NET SQL Server注册工具所要做的是将%WINDOWS%/Microsoft.NET/Framework/v2.0.50727/InstallCommon.sql创建的脚本稍加修改后运行.而%WINDOWS%/Microsoft.NET/Framework/v2.0.50727/InstallCommon.sql的脚本将尝试连接名为aspnetdb的数据库.它将建立所有与membership相关的服务: Membership, Roles, Profile, Personalization等等.更多的脚本见%WINDOWS%/Microsoft.NET/Framework/v2.0.50727/目录.

脚本尝试连接具体的数据库(要么是aspnetdb数据库,要么是在向导里指定的数据库)。如果它不能在server's sysdatabases table表里找到该数据库的话, 那么就将根据指定的名称创建数据库,再添加各种表、视图、存储过程.


从命令行运行ASP.NET SQL Server注册工具

除了图形界面以外,我们也可以从命令行调用ASP.NET SQL Server注册工具。导航到 %WINDOWS%/Microsoft.NET/Framework/v2.0.50727,运行:

-- To use Windows Authentication (i.e., a "trusted connection"), use:
aspnet_regsql.exe -S <server> -E -d <database> -A all

-- To use SQL Server credentials (a UserID and Password), use:
aspnet_regsql.exe -S <server> -U <login id> -P <password> -d <database> -A all

其中-A all将安装与membership相关的所有服务。你也可以用-A list来安装某个具体的membership特性,比如-A mr将安装membership和roles.运行aspnet_regsql.exe -? 将查看所有选项的全部清单. 

如果你的应用程序现有的数据库为App_Data文件夹里的一个SQL Server 2005 Express Edition版本的数据库.你也许想知道如何正确的通过ASP.NET SQL Server注册工具来访问它. 那么你如何处理server name, credentials,以及database name呢?首先声明我不是专家,下面的意见为我自己认识到的:

.Server name为localhost/InstanceName——默认时SQL Server 2005 Express Edition的InstanceName为SQLExpress,因此使用的Server name就为localhost/SQLExpress.

.SQL Server 2005 Express Edition默认安装为接受Windows Authentication.所以将authentication项设置为Windows Authentication.

.database name有点棘手.就我所知,当在App_Data数据库里创建一个SQL Server 2005 Express Edition数据库时,那么数据库名为其完整的路径,比如如果数据库完整路径为C:/Home/Websites/PhotoAlbum/App_Data/Photos.mdf,那么其数据库名也为C:/Home/Websites/PhotoAlbum/App_Data/Photos.mdf. 不过我们需要将其添加为SQL Server 2005 Express Edition实例,以便于ASP.NET SQL Server注册工具引用.

对现有的SQL Server 2005 Express Edition数据库提供一个名称,使用免费下载的SQL Server 2005 Management Studio Express Edition来做是很容易的.

如果你的电脑里安装的是SQL Server 2005 Standard Edition或更高版本的话,那么你也已经装好了SQL Server 2005的Management Studio 。那么你就无法再安装Management Studio的Express Edition版本了.

如果你不能在连接屏幕通过:localhost/SQLExpress (或者你安装的其它目录)来连接到SQL Server 2005 Express Edition数据库实例的话,


                                                               图5

那么在Management Studio里,连接到一个database server后,在 Databases文件夹上点击右键,选“Attach”,来分配数据库.你然后可以选择需要的数据库。该数据库的名称为初始(original)创建时的完整路径名.我说“初始”是因为如果你将该数据库文件从一个目录移动到另一个目录的话,它的名称依然是最初创建时的完整路径.要改变数据库的名称,可以点“Script” 按钮,再重命名。还一个方法,在Management Studio里,在该数据库上右键单击,选“Rename”.


                      图6

完成添加后,我们就可以用ASP.NET SQL Server注册工具来引用它.如果你不想用Management Studio来进行添加,那么请参阅文章《Working With SQL Server 2005 Express Databases》(http://scottonwriting.net/sowblog/posts/5480.aspx)


让Membership Providers使用应用程序现有的数据库

当将与membership相关的schema转移到应用程序现有的数据库后,我们将从现有数据库进行membership相关的查询,而不是从ASPNETDB.MDF数据库.然而SQL Server Membership的几个provider——SqlMembershipProvider, SqlRoleProvider, SqlProfileProvider等都默认使用ASPNETDB.MDF数据库.为此,我们要在Web.config文件里添加我们自己的provider实例以使用现有的数据库,并作为默认的Membership providers.

就像在Part 1探讨的那样,我们可以在Web.config文件对provider信息进行配置,使membership  providers和roles providers调用现有的数据库而不是ASPNETDB.MDF,如下:

<configuration>
  <connectionStrings>
     <add name="MyDB" connectionString="..." />
  </connectionStrings>
  <system.web>
    ... authentication & authorization settings ...

    <roleManager enabled="true"
                 defaultProvider="CustomizedRoleProvider">
      <providers>
         <add name="CustomizedRoleProvider"
              type="System.Web.Security.SqlRoleProvider"
              connectionStringName="MyDB" />
      </providers>
    </roleManager>

    <membership defaultProvider="CustomizedMembershipProvider">
      <providers>
         <add name="CustomizedMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider"
              connectionStringName="MyDB" />
      </providers>
    </membership>

  </system.web>
</configuration>

以上设置为membership 和 roles systems创建了一个用户自定义providers,用到的连接字符串为“MyDB”,它指向了应用程序里现有的数据库.

结语:

当对程序启动membership支持后,我们需要将membership schema应用到一个现有的数据库上,该工作可以通过ASP.NET SQL Server注册工具来完成。完成之后,最后一步是对provider进行定制,以使用现有的数据库而不是默认的ASPNETDB.MDF

祝编程快乐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值