成员关系的概念在人类社会中是一个层次比较低的概念,源于希望属于某个群组的意识。我们希望能觉得自己是某个团队的一部分,让别人知道我们是谁,因此Web搭上这个流行趋势,采用这个概念只是时间早晚的问题。如果坐下来想一想曾经登录过多少个站点并在这些站点上保存了简单的用户信息,可能会发现自己所属的群组比一开始想象的要多得多。从出售书籍和小器具的站点到讨论拥有一辆Ford Puma的好处的社区,或者宣传一个名为Look Around You的BBC TV喜剧节目的站点,作者发现自己是会员的站点多得无法一一列举。接下来就会碰到一个熟悉的困难“登录这个站点要使用哪个用户名和口令?”
Web上最成功的站点之一,Amazon.com,一开始只是一个书店,但后面经营的范围越来越大。现在当用户登录Amazon时,将发现整个页面上全是与该用户的消费习惯有关的商品。
在本章中,您将学习怎样使用ASP.NET 2.0提供的成员关系功能实现站点的个性化。本章讨论如下内容:
●身份、验证和授权的概念
●成员关系服务器变量,包括Login控件
●保存成员配置文件以便取回
●在站点的特定部分实施访问限制,只运行特定的成员访问
●根据当前用户配置文件个性化站点
还将扩展Wrox United示例站点,以便能够登录该站点并根据一组保存起来的个人偏好个性化站点,这些信息是基于成员配置文件的。
4.1 安全基础知识
在开始开发涉及到成员关系的应用程序时,必须首先理解几个关键的概念,这些概念是身份、验证和授权。
4.1.1 身份——我是谁在考虑身份时,我们可以用几种独一的特性来描述自己。例如,我是一个头发金黄的女人,喜欢看科幻电影和组装PC机,但这些信息对于对我的羽毛球技术感兴趣的人来说并不是必需的。保存在站点中的身份信息很可能只与一个人的某些方面相关。例如,一个购物站点会保存用户的姓名、电话号码、电子邮件地址和家庭地址,这些信息都与商品的销售有关。它们可能不会关心您的个人兴趣(除非它们和Amazon的规模一样大),所以它们并不需要保存关于用户的这类信息,但是这并不妨碍它们拥有这些方面的身份信息。
因此身份,也就是我是谁的概念,是一组范围很广的实际情况的集合。您可能曾经在简历里写下了很多实际情况,但这些情况同样只与潜在的雇主相关。在简历中保存和删除哪些情况由自己决定。在保存一个站点的成员的信息时,情况也是一样的,必须在开发阶段就确定要保存成员的哪些实际情况。
4.1.2 身份验证——这就是我在试图登录一个网站的时候,用户要输入某些证书;例如,邮件地址及其口令的组合。网站接下来必须判断用户是否就是自己声明的那个人,因此用户输入的邮件地址和口令的组合必须与保存在服务器文件中特定的邮件地址和口令组合相匹配。
身份验证的过程就是证明自己是自己所声明的那个人的过程。很多站点,不论它们是零售商品还是提供社区服务,都使用邮件地址和口令的组合作为身份验证方法,这是一种经过反复考验的方法。虽然这种方法不是绝对安全,但是只要选择一个足够可靠的口令并严格保密,同时站点的代码经过严格的测试,那么用户的配置文件将只能由用户本人使用。
4.1.3 授权——这是我能做的在向网站输入用户名和口令之后,Web服务器将不仅会验证口令和用户名是否匹配,还将查看站点管理员给用户授予了什么权限。身份验证之后的下一个步骤是授权,这个步骤将检索您所拥有的用户账户类型的更多信息。
例如,以一个银行网站为例。在用户的登录信息通过验证之后,服务器将查看用户在该站点上的权限。与大多数用户一样,您可以查询账户、在账户之间转账或者支付账单。然而,如果银行受到某个安全方面的恐吓(类似于Internet上到处流传的网络钓鱼(phishing)电子邮件),您可能会发现自己突然无法通过这个在线应用程序添加任何第三方代理订单,直到安全危机解除为止。功能的关闭很可能是由管理员为一些或所有用户设置一个特殊的标记而进行控制的,在页面上告诉用户他们不再有权限修改他们账户的详细信息。
4.1.4 登录站点登录站点的过程,从用户的角度看,就是输入一组证书,然后根据自己的配置文件看到不同用户界面的过程。通常,用户所使用的证书是用户名加口令的组合;然而,对于安全性更高的站点,例如银行站点,可以使用其他的方式登录,包括PIN和安全认证。如果不考虑向服务器传送身份验证证书的方法,那么身份验证的基本原则是一样的。一旦验证完成之后,通过身份验证机制查询用户具有什么样的权限就比较简单了。
撇开理论,ASP.NET 2.0提供了一些非常强大的工具,可以帮助开发人员以最小的代价实现登录-身份验证-授权架构。在旧版的ASP.NET中,开发人员必须编写代码实现登录、根据数据库进行验证并根据当前登录的用户做出响应。虽然开发人员最终仍要编写代码对用户进行处理(如本章后面的内容所示),但是一些强大的控件和向导已经把这个过程起始阶段的各种困难都解决了。在这一节中,将进一步学习用于处理登录的服务器控件和ASP.NET Web
Application Configuration实用工具。