分享
 
 
 

使用 IIS 进行 ASP.NET 2.0 成员/角色管理(2):实现

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

摘要:本文介绍如何通过创建三层结构式 ASP.NET 2.0 应用程序来维护 IIS 生产服务器中的成员身份数据库和角色数据库。

简介

成员身份编辑器

Microsoft Visual Studio 2005 版本中没有用于维护 Microsoft IIS 中的成员身份数据库和角色数据库的“现成”解决方案。将开发环境中的应用程序移至 IIS 生产服务器时这就会是个问题。Microsoft 提供的实用程序 ASP.NET Web Configuration 只能在非生产的开发环境中运行。本文及其关联代码将通过对成员和角色管理实现三层式解决方案,同时使用 Microsoft ASP.NET 标准工具,来解决这个问题。这意味着该实用程序将可在任何 ASP.NET 2.0 环境(包括 IIS)中运行。该解决方案十分灵活,可以轻易添加到任何现有的 ASP.NET 2.0 网站项目中。

该解决方案的层定义如下。第一层 ASP.NET 页面(也称为表示层)通过对象数据源与两个业务对象进行连接。这些业务对象起中间层作用,是成员和角色的包装程序。第三层(即后端)由 ASP.NET 提供的成员身份和角色管理器 API 组成。中间层对象可以轻松地加入任何 ASP.NET 2.0 项目,并且几乎无需进行任何更改就可以直接使用。

本文深入地介绍了中间层(即数据对象及其关联 ObjectDataSource)的实现。接着,介绍了如何在使用 Microsoft SQL Server Express 2005(捆绑有 Visual Studio 2005)的 ASP.NET Web 项目中使用这些对象。但是由于 Microsoft 提供的成员身份 API 使用其提供商的技术,因此此处介绍的解决方案与数据库无关。从 LDAP、SQL Server 或 Oracle 即可轻松获得成员身份和角色信息。

采用的技术

ObjectDataSource

定义了两个 ObjectDataSource 实例。一个是有关成员身份数据(用户名、创建日期、批准状态等)的,另一个是有关角色(管理员、朋友等)的。这两个数据源均完全填充了所有数据访问方法,即两者都包含执行插入、更新、删除和选择的 Member 函数。两个 ObjectDataSource 实例都返回 Generic List 类型,这意味着在 GridView 中,列名将自动设置为 ObjectDataSource 的属性值名。此外,还实现了自定义排序,以便用户可以单击 GridView 中的列标题来根据需要对数据进行正向或反向排序。

SQL Server Express 2005 和 Web.Config

成员身份数据库和角色数据库的数据提供程序源是 SQL Server Express 2005。为实现这一点,需要在 web.config 文件中设置相应的条目。本文稍后将对如何从头开始设置新项目进行简要的介绍。web.config 文件中未提及 SQL Server Express 2005 的连接字符串,因为它已在 Microsoft .NET 2.0 Framework 的默认部分 Machine.Config 文件中定义。

支持 IIS(5.1 和 6.0)

Web 服务器可以为 5.1 版,也可以为 6.0 版。若要对登录 Web 应用程序的多个用户进行测试,必须使用 IIS。内置开发 Web 服务器不能正确保持各不同登录用户的状态。内置开发 Web 服务器不能正确保持各不同登录用户的状态。尽管可以使 Asp.net Web 配置工具与 IIS 一起工作,但尚未完成实现这一目的所必需的附加安全工作。

GridView 控件

GridView 用于显示成员身份和角色的数据。如上文所述,由于使用了 ObjectDataSource 的 Generic 类型,GridView 的列名将自动以 ObjectDataSource 的属性值命名。如果没有使用 Generic 类型,则列名恢复为无意义的默认值,必须手动逐个进行编辑。

应用程序和项目

运行此实用程序所需的项目非常简单,并且是独立的。项目文件可以下载,包含功能完整的示例。由于用户和角色没有直接访问数据库的权限,因此所要做的事情就是获取三个数据对象(MembershipDataObject.cs、MembershipUserSortable.cs 和 RoleDataObject.cs,请参见图 2)。

图 2:成员身份编辑器项目

SamplePages 文件夹中有几个其他的示例,演示了前面提及的模块的用法。图 1 中显示的 Membership.aspx 即是其中一例,它可用于选择、更新、插入及删除成员和角色,以及为成员分配角色。

使用已有工作成员身份模块的工作 ASP.NET 2.0 应用程序时,无需对这些页面进行已做配置之外的外部配置。可以将这些文件直接复制到项目中,复制后即可使用。

如果是第一次在应用程序中实现成员身份和角色管理,则创建使用这些对象的解决方案的过程如下,

1. 使用 Visual Studio 2005 创建类型为 ASP.NET 网站的新 Web 项目。

2. 单击菜单上的 Website / ASP.NET Configuration(网站/ASP.NET 配置)。

3. 按照向导提示的步骤(1 至 7)进行操作来创建一些示例用户和角色。这将在当前项目中有效地创建有效 web.config 文件,其中包含能够启动并运行成员管理的充足信息。默认情况下,它将在其默认配置中使用 SQL Server Express 2005。

4. 在项目中添加三个 .cs 文件,然后添加示例 .aspx 页面作为示例。

ObjectDataSource 详细信息

采用 ObjectDataSource 技术可以创建作用与 SqlDataSource 非常相似的数据源,即它提供允许从永久数据存储区(例如数据库)中进行选择、更新、插入和删除记录(或类似记录的对象)的界面。本文以下各部分将讨论 ObjectDataSource 用于操作成员身份的对象(即类文件)。其在项目中的名称为 MembershipUserODS.cs。

类 (MembershipUserODS)

由于是通过 Microsoft 成员身份 API 检索数据,因此使用 ObjectDataSource 来解决问题。第一步是创建独立的类,该类对 MembershipUser 进行包装,以便它可以与 ObjectDataSource 关联。下例中介绍了一组需要实现的典型方法,本文以下各部分将介绍如何实现每个成员函数。本文省略了许多细节,但本文附带的源代码中包含这些细节。

[DataObject(true)

public class MembershipUserWrapper {

[DataObjectMethod(DataObjectMethodType.Select, true)]

static public Collection<MembershipUserWrapper> GetMembers(string

sortData) {

return GetMembers(true, true, null, sortData);

}

[DataObjectMethod(DataObjectMethodType.Insert, true)]

static public void Insert(string UserName, bool isApproved,

string comment, DateTime lastLockoutDate, ...) {

}

[DataObjectMethod(DataObjectMethodType.Delete, true)]

static public void Delete(object UserName, string Original_UserName){

Membership.DeleteUser(Original_UserName, true);

}

[DataObjectMethod(DataObjectMethodType.Update, true)]

static public void Update(string original_UserName,string email,...){

}

}

类声明

上面显示的类声明因具有属性 [(DataObject(true)],比较特殊。此属性告诉 Visual Studio 2005 ObjectDataSource 创建向导,在数据类中搜索 DataObject 时只查找具有此特殊属性的成员。请参阅本部分中介绍在何处为 GridView 组件分配此类的示例。

Insert 方法

各部分的细节都涉及以非常简单的方式使用 Microsoft 提供的成员身份 API。例如,下面是一个较详细的典型 Insert 方法。

[DataObjectMethod(DataObjectMethodType.Insert,true)]

static public void Insert(string userName, string password,)

{

MembershipCreateStatus status;

Membership.CreateUser(userName, password,);

}

此类 Insert 是多态的,这意味着可以存在用于不同目的的多个 Insert 方法。例如,动态决定是否应该根据环境批准创建的用户时,可能需要使用它。又如,在管理屏幕中创建的新用户可能想创建默认为已批准的用户,而用户注册屏幕可能默认为未批准。为此,需要另一个具有额外参数的 Insert 方法。可实现此目标的 Insert 方法大致如下。

[DataObjectMethod(DataObjectMethodType.Insert,false)]

static public void Insert(string userName, string password, bool isApproved)

{

MembershipCreateStatus status;

Membership.CreateUser(UserName, password,,

isApproved, out status);

}

与此处所列的其他方法一样,显示的示例并非附带源中实际存在的示例。此处的示例是为了说明各个方法的典型用法。源代码中包含的用法更为完备且带有注释。

Update 方法

Update 方法是实现成员身份 API 的一种非常简单的方法。与 Insert 方法一样,Update 方法也可以有多种实现。此处只介绍一种实现。在可下载的代码中,有更多 Update 的多态实现,其中一种只设置 IsApproved 属性(如下例所示)。

[DataObjectMethod(DataObjectMethodType.Update,false)]

static public void Update(string UserName,bool isApproved)

{

bool dirtyFlag = false;

MembershipUser mu = Membership.GetUser(UserName);

if (mu.isApproved != isApproved)

{

dirtyFlag = true;

mu.IsApproved = isApproved;

}

if (dirtyFlag == true)

{

Membership.UpdateUser(mu);

}

}

Delete 方法

Delete 方法是最简单的方法,它只使用一个参数 UserName。

static public void Delete(string UserName)

{

Membership.DeleteUser(UserName,true);

}

具有 Sort 属性的 Select 方法

在本示例中,Select 方法 GetMembers 具有多个组件,每个组件都值得介绍。首先介绍其返回的值,然后是方法本身,最后介绍其如何排序返回值。

Select 方法的返回值(类型为 Collection)

Select 方法(也称为 Get)的返回值为 Generic Collection 类。使用 Generic 是因为最终与该类关联的 ObjectDataSource 使用反射来确定列名和类型。这些名称和类型与返回的每行数据相关联。此方法与 SqlDataSource 使用表或存储过程的数据库元数据来确定每行的列名相同。由于 Select 方法的返回类型为 MembershipUserWrapper(继承自 MembershipUser),此类的大多数属性都是与 MembershipUser 关联的相同属性。这些属性包括,

• ProviderUserKey

• UserName

• LastLockoutDate

• CreationDate

• PasswordQuestion

• LastActivityDate

• ProviderName

• IsLockedOut

• Email

• LastLoginDate

• IsOnline

• LastPasswordChangedDate

• Comment

在此插一句,属性值有一个非常好的特点 - 它们可以是只读的(无设置方法)、只写的(无读取方法),当然也可以是读/写的。ObjectDataSource 向导考虑到了这一点,并创建了相应的参数,这样在使用 ObjectDataSource 呈现数据控件时,只有可更新(读/写)的字段能够编辑。这意味着您不能更改某些属性,例如 UserName 属性。如果这一点现在还不清楚,稍后在我们更详细地阐述 ObjectDataSource 和数据组件时,就容易明白。

Select 方法本身

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有