现在的位置: 首页 > 综合 > 正文

考察ASP.NET 2.0的Membership, Roles,Profile – Part 8

2013年12月07日 ⁄ 综合 ⁄ 共 4936字 ⁄ 字号 评论关闭

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

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

导言:

我最近遇到一个网站,其主要包含一些静态的内容.在客户端,需要一个页面来从一个数据库表里显示数据.另外,还需要一个页面来便于管理员添加、更新、删除数据.用ASP.NET 2.0的数据源控件以及Membership system,该功能可以很容易的实现。不过有一个问题,由于服务器不支持SQL Server数据库,只有用Access数据库来代替。问题来了,.NET Framework BCL只包含了一个支持Microsoft SQL Server数据库的Membership provider.

可喜的是,微软提供了一个Access数据库模板及在Membership, Roles,Profile里使用Access数据库的provider.在本文我们将探讨如何得到这些基于Access的provider以及如何在ASP.NET 2.0 web应用里使用它们.获取并使用Access Provider

在ASP.NET 2.0的Beta版本里,微软为Membership, Roles, Profile设计的基于Access和SQL Server数据库的provider,并作为基本类库的一部分包含在.NET Framework里.到ASP.NET 2.0 正式发行的时候,微软决定剔除内置的对Access数据库的支持,而只支持Microsoft SQL Server 2005 Express Edition版本数据库.但是不见得所有人都转移到SQL Server 2005.很多web服务器公司就不支持Express Edition.其它人可能在此之前设计的是基于Access数据库的应用程序并使用的很好,要转变到SQL Server的话可能困难重重.

还好,我们可以从微软单独下载到Access providers,其为一个Microsoft Visual Studio安装文件(VSI),包含了C# class类文件以及一个Access数据库.你可以在这里:http://download.microsoft.com/download/5/5/b/55bc291f-4316-4fd7-9269-dbf9edbaada8/SampleAccessProviders.vsi进行下载,当然在本文的下载文件里也包含它.

我们必须采取以下3个步骤才能使用Access providers:

1.将Access Provider Classes类应用到Web Application——下载内容里的C# class类文件要么被编译为一个文件并放到web应用程序的/bin目录文件夹里,要么将这些类文件拷贝到App_Code文件夹.

2.准备好数据库——确保应用程序里有一个Access数据库.

3.更新Web.config文件—必须对Web.config文件进行设置以使应用程序为Membership, Roles,Profile调用Access providers而不是默认的SQL Server providers.

第一步:将Access Provider Classes类应用到Web Application

下载完该VSI文件后,双击以进行安装过程,这将把文件安装到恰当的文件夹(就我的电脑而言:My Documents/Visual Studio 2005/Templates/ProjectTemplates/Visual Web Developer/Starter Kits).在“New Projects”对话框里可以找到一个模板,如下面的截屏所示:

                                                                             图1

创建一个新工程,用该ASP.NET Access Providers模板创建一个Class Library对象.在此,最理想的是将Class Library对象进行编译得到一个文件,比如AccessProviders.dll.再将其拷贝到应用程序的/bin目录下,这将允许你为Membership, Roles, Profile调用Access provider. 这是最理想的方法因此它便于部署和维护.

另外,你还可以将模板使用的C# class类文件拷贝到应用程序的App_Code文件夹里.最简单的方法是从下载的VSI文件里将其抽出来,在安装向导的第一步里,选择"View files in Windows Explorer",该VSI文件包含一个ZIP压缩文件(ASP.NET Access Providers.zip),在它的Samples目录下包含了必需的类.将这些类拷贝进App_Code文件夹.

                                                                                 图2

第二步:准备好数据库

该VSI文件包含了一个Microsoft Access数据库(ASPNetDB.mdb),其包含了必需的表和视图.我们要将该数据库放在我们的应用程序里。我们可以在Windows资源管理器里查找到VSI里包含的Access数据库;或者安装完VSI后,我们也可以在硬盘里找到该数据库.不管是哪种方式,你都要将这个ASPNetDB.mdb数据库拷贝到App_Data文件夹.确保该文件没有标明为只读,这样那些用户帐户才有对App_Data文件夹的读写权限.

第三步:更新Web.config文件

最后我们要更新Web.config文件,以使Membership, Roles,Profile使用基于Access的provider而不是默认的基于SQL Server的provider.我们也需要在<connectionStrings>节点引用该Access数据库的路径.

首先添加新的<connectionStrings>,假定你的数据库还是ASPNetDB.mdb且放在App_Data文件夹里,你可以使用如下的代码:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
   <connectionStrings>
      <add name="LocalAccessDatabase" connectionString="~/App_Data/ASPNetDB.mdb"

providerName="System.Data.OleDb"/>
   </connectionStrings>

   <system.web>
      ...
   </system.web>
</configuration>

接下来在<system.web>元素,添加必要的Membership, Roles,Profile元素.下面的声明清除了默认的Membership provider设置,而将AccessMembershipProvider作为应用程序默认的Membership provider:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
   <connectionStrings>
      <add name="LocalAccessDatabase" connectionString="~/App_Data/ASPNetDB.mdb"

providerName="System.Data.OleDb"/>
   </connectionStrings>

   <system.web>
      <membership defaultProvider="AccessMembershipProvider">
         <providers>
            <clear/>
            <add name="AccessMembershipProvider"
               type="Samples.AccessProviders.AccessMembershipProvider, AssemblyName"
               connectionStringName="LocalAccessDatabase"
               enablePasswordRetrieval="false"
               enablePasswordReset="false"
               requiresUniqueEmail="false"
               requiresQuestionAndAnswer="false"
               minRequiredPasswordLength="1"
               minRequiredNonalphanumericCharacters="0"
               applicationName="SampleSite"
               hashAlgorithmType="SHA1"
               passwordFormat="Hashed"/>
         </providers>
      </membership>
   </system.web>
</configuration>

我们注意到<connectionStrings>节点用到的name与<add>元素里的connectionStringName属性的值一样(都是LocalAccessDatabase).如果你将类编译成一个文件并拷贝到/bin目录的话,type应该使用"Samples.AccessProviders.AccessMembershipProvider, AssemblyName";而如果你将类文件拷贝到App_Code文件夹的话,type应该使用 "Samples.AccessProviders.AccessMembershipProvider".

一旦完成上面3个步骤后,你就按同一种方式来使用Membership, Roles, Profile system就像是在使用默认的基于SQL Server的provider一样(也不完全正确,见如下的警告以及VSI里的README文件)。这意味着你可以使用Security Web控件——Login, LoginView, CreateUserWizard等.本文下载代码里包含了一个简单的website,它的Membership 和 Roles功能调用的是Access providers.

关于使用Access-based Providers的警告

VSI里的README文件指出了使用Access Membership provider的缺点,我这里再次重申:

1——在CreateUser 和 ChangePassword方法里并没有强制性的对密码长     度做出要求,该设置可以进行读取但不能被provider使用.

2——不能在provider里执行帐户锁定,自然,UnlockUser方法也无效.同      时不能阻止带有恶意的password 或password answer的企图.

3——不支持创建带有一个明显UserId(比如providerUserKey)的新用户

4——不支持创建检索一个基于UserId(比如providerUserKey)的用户

参见README文件以获取更多的信息

结语:

本文我们考察了适用于Membership, Roles,Profile的Access providers,它允许开发者使用一个Access数据库来作为Membership, Roles, 以及 Profile systems的存储备份(backing store)

祝编程快乐!

抱歉!评论已关闭.