【C#.NET】保护你的ASP.NET应用程序(二)ASP.NET 2.0的成员资格和角色管理器
15.5 ASP.NET 2.0的成员资格和角色管理器
一套完善的用户权限系统少不了成员和角色的管理,而权限系统相对于网站的其他部分又相对独立。ASP.NET 2.0把成员和角色管理封装成了一个完整的系统。对于小型的系统,我们可以使用登录控件和ASP.NET网站管理工具来实现成员和角色管理(无需编写一行代码),对于大型的系统,我们也可以使用ASP.NET 2.0成员资格和角色管理器API来编码实现自定义的成员和角色管理。
ASP.NET 2.0成员资格负责用户的管理,角色管理器负责角色的管理,登录控件负责面向用户的成员服务(注册、登录、修改和取回密码),ASP.NET表单验证负责用户凭据的管理,ASP.NET网站管理工具负责面向管理员的安全配置,ASP.NET基于URL的授权负责用户角色对于目录的授权管理,一套完整的用户、角色和权限管理系统就这样诞生了。
15.5.1 成员资格概述
ASP.NET成员资格为我们提供了一种验证和存储用户凭据的内置方法。因此,ASP.NET成员资格可以帮助我们管理网站中的用户身份验证。可以将ASP.NET成员资格与基于表单的身份验证或ASP.NET登录控件一起使用,以创建一个完整的用户身份验证系统。ASP.NET成员资格支持下列功能:
· 创建新用户和密码。
· 将成员资格信息(用户名、密码和支持数据)存储在Microsoft SQL Server、Active Directory或其他数据存储区。
· 对访问站点的用户进行身份验证。可以以编程方式验证用户,也可以使用 ASP.NET 登录控件创建一个只需很少代码或无需代码的完整身份验证系统。
· 管理密码,包括修改和找回密码。
· 公开经过身份验证的用户的唯一标识,可以在我们自己的应用程序中使用该标识,也可以将该标识与 ASP.NET 个性化设置和角色管理(授权)系统集成。
· 指定自定义成员资格提供程序,这使我们可以改为用自己的代码管理成员资格及在自定义数据存储区中维护成员资格数据
ASP.NET 成员资格系统的设计目的主要是用于 ASP.NET 登录控件和 ASP.NET表单验证。也就是说,成员资格系统对于那些需要在程序中获取用户凭据并进行验证的应用程序最为有用。当然,也可以将 ASP.NET 成员资格用于任何自定义的身份验证系统。
15.5.2 成员资格的配置
要使用成员资格,首先需要使用membership元素的defaultProvider属性来指定默认的成员资格提供程序。如果没有显式指定默认的提供程序,计算机配置将指定一个名为AspNetSqlMembership Provider的SqlMembershipProvider实例(它被标识为默认的提供程序)。AspNetSqlMembershipProvider连接到本地SQL Server中的aspnetdb数据库。但是如果你不希望成员资格使用默认的Express数据库,或者希望自定义成员资格的一些属性,那么就需要自定义一个成员资格提供程序。
<configuration>
<connectionStrings>
<add name="MySqlConnection" connectionString="server=srv-devdbhost;uid=
sa;pwd=Abcd1234;database=aspnetdb" />
</connectionStrings>
<system.web>
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="MySqlConnection"
applicationName="MyApplication"
</providers>
</membership>
</system.web>
</configuration>
注意以下几点。
· <membership>节点的userIsOnlineTimeWindow属性表示用户多少分钟不活动后被视为下线。
· 增加一个自定义的SqlServer成员资格提供程序必须指定name、type、connectionStringName和applicationName 4个属性,其他属性见下表。
属性 |
默认值 |
用途 |
enablePasswordReset |
true |
如果成员资格提供程序支持密码重置,则为true;否则为false |
requiresQuestionAndAnswer |
true |
如果密码重置和检索需要提供密码提示问题答案,则为true;否则为false |
requiresUniqueEmail |
true |
如果成员资格提供程序要求唯一的电子邮件地址,则返回true;否则返回false |
maxInvalidPasswordAttempts |
5 |
获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数 |
passwordAttemptWindow |
10 |
在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数 |
passwordFormat |
Hashed (不可逆加密) |
MembershipPasswordFormat值之一,该值指示在数据存储区中存储密码的格式 |
minRequiredPasswordLength |
7 |
密码所要求的最小长度 |
minRequiredNonAlphanumericCharacters |
1 |
有效密码中必须包含的最少特殊字符数 |
PasswordStrengthRegularExpression |
用于计算密码的正则表达式。 比如,长度大于7个字符、至少包含一个数字、至少包含一个特殊字符(非字母数字字符)的表达式为: @""(?=.{6,})(?=(.*"d){1,})(?=(.*"W){1,}) |
· 在这里我们配置了一个自定义成员资格提供程序,并使用srv-devdbhost服务器上的aspnetdb数据库。因此,需要先使用aspnet_regsql工具来注册数据库,步骤如下。
1.打开Visual Studio 2005命令行提示,输入aspnet_regsql,出现如图15-23所示的对话框。
图15-23 ASPNET_REGSQL工具
2.单击“下一步”按钮,选择“为应用程序服务配置SQL Server”项,如图15-24所示。
图15-24 选择安装选项
3.填写目标数据库的连接信息,如图15-25所示。
图15-25 选择服务器和数据库
4.在确认了所有信息后,单击“完成”按钮,这样用于ASP.NET服务的数据库就在目标数据库上创建完成了。
15.5.3 角色管理器概述
角色管理不仅限于限制对页面或文件夹的权限。角色管理还提供一个API,可使用该API以编程方式确定用户是否属于某角色。这使您能够编写利用角色的代码,并能够不仅基于用户是谁而且基于用户所属的角色来执行所有应用程序任务。
如果在应用程序中建立了用户标识,则可以使用角色管理API方法创建角色、向角色中添加用户,并获取有关用户在角色中的分配情况的信息。这些方法使你可以创建自己的用于管理角色的接口。
如果应用程序使用Windows身份验证,则角色管理API为角色管理提供的功能较少。例如,不能使用角色管理创建新角色。不过,可以使用Windows用户和组管理创建用户账户和组,并将用户分配到组。然后,角色管理可以读取Windows用户和组信息,以便你可以使用此信息进行身份验证。
若要使用角色管理,首先要启用它,并配置能够利用角色的访问规则(可选)。然后可以在运行时使用角色管理功能处理角色。对于配置角色管理、定义角色、向角色中添加用户和创建访问规则而言,最简单的方法是使用网站管理工具。
若要使用ASP.NET角色管理,请在应用程序的Web.config文件中使用如下所示的设置启用它。
<roleManager
enabled="true"
cacheRolesInCookie="true" >
</roleManager>
15.5.4 角色管理器的配置
<roleManager>节点的配置如下:
<roleManager
cacheRolesInCookie="true|false"
cookieName="name"
cookiePath="/"
cookieProtection="All|Encryption|Validation|None"
cookieRequireSSL="true|false"
cookieSlidingExpiration="true|false "
cookieTimeout="number of minutes"
createPersistentCookie="true|false"
defaultProvider="provider name"
domain="cookie domain">
enabled="true|false"
maxCachedResults="maximum number of role names cached"
</roleManager>
各属性作用见下表。
属性 |
说明 |
cacheRolesInCookie |
指定当验证某个用户是否在特定角色中时,先检查Cookie,然后使用角色提供程序在数据源中检查角色列表。如果为true,则缓存当前用户的Cookie中的角色名称列表;否则为false。 默认值为false |
cookieName |
指定存储角色名称的Cookie的名称。 默认值为“.ASPXROLES” |
续表
属性 |
说明 |
cookiePath |
角色名称Cookie的路径。 默认值为“/” |
cookieProtection |
指定CookieProtection枚举值之一。 默认值为All值 |
cookieRequireSSL |
指定角色名称Cookie是否需要使用SSL来发送到服务器。 如果设置为true,则角色名称Cookie需要使用SSL来发送到服务器。 默认值为false |
cookieSlidingExpiration |
指定是否将定期重置角色名称Cookie的过期日期和时间。 如果设置为true,则Cookie的过期日期和时间最初将设置为当前日期和时间与CookieTimeout值(分钟)的加和。当用户继续主动地使用ASP.NET应用程序时,Cookie的过期日期和时间将在剩余时间不足CookieTimeout值的一半时自动更新。 默认值为true |
cookieTimeout |
角色名称Cookie过期之前的时间(分钟)。 默认值为30(分钟) |
createPersistentCookie |
指定角色名称Cookie是否为会话 Cookie;即该Cookie会在浏览器关闭时丢失。 如果设置为true,则角色名称Cookie是可跨多个浏览器会话使用的持久性Cookie。持久性Cookie的过期日期和时间设置为当前的日期和时间与CookieTimeout值(分钟)的加和。 默认值为false。 |
defaultProvider |
默认角色提供程序的名称。 默认值为“AspNetSqlRoleProvider” |
domain |
指定角色名称Cookie的Domain值。 默认值为HttpCookie属性默认值,该值为空字符串("") |
enabled |
指定是否要启用角色管理。 如果设置为true,则启用角色管理。 默认值为false |
maxCachedResults |
指定缓存在角色Cookie中的角色名称的最大数目。 默认值为25 |
15.5.5 安全性相关的控件
作为一个完整的用户系统,为用户提供注册、登录和修改密码等操作是不可少的。ASP.NET提供了众多的登录控件,无需编程就可以实现完整而且可靠的登录解决方案。默认情况下,登录控件与ASP.NET成员资格集成,以帮助使网站的用户身份验证过程自动化。默认情况下,ASP.NET登录控件以纯文本形式工作于HTTP上。如果你对安全性十分关注,那么可以使用带SSL加密的HTTPS。
· Login控件
Login控件显示用于执行用户身份验证的用户界面。Login控件包含用于用户名和密码的文本框和一个复选框,该复选框让用户指示是否需要服务器使用ASP.NET成员资格存储他们的标识,并且当他们下次访问该站点时自动进行身份验证。Login控件有用于自定义显示、自定义消息的属性和指向其他页的链接,在那些页面中用户可以更改密码或找回忘记的密码。Login控件可用作主页上的独立控件,或者你还可以在专门的登录页上使用它。
· CreateUserWizard控件
CreateUserWizard控件收集潜在用户提供的信息。默认情况下,CreateUserWizard控件将新用户添加到ASP.NET成员资格系统中。CreateUserWizard控件收集下列用户信息,用户名、密码、密码确认、电子邮件地址、安全提示问题和安全答案。
· PasswordRecovery控件
PasswordRecovery控件允许根据创建账户时所使用的电子邮件地址来找回用户密码。PasswordRecovery 控件会向用户发送包含密码的电子邮件。我们可以配置ASP.NET成员资格,以使用不可逆的加密来存储密码。在这种情况下,PasswordRecovery控件将生成一个新密码,而不是将原始密码发送给用户。我们还可以配置成员资格,以包括一个用户为了找回密码必须回答的安全提示问题。如果这样做,PasswordRecovery 控件将在找回密码前提问该问题并核对答案。
· ChangePassword控件
通过ChangePassword控件,用户可以更改其密码。用户必须首先提供原始密码,然后创建并确认新密码。如果原始密码正确,则用户密码将更改为新密码。该控件还支持发送关于新密码的电子邮件。ChangePassword控件由通过身份验证和未通过身份验证的用户使用。如果用户未通过身份验证,该控件将提示用户输入登录名。如果用户已通过身份验证,该控件将用户的登录名填入文本框。
· LoginView控件
使用LoginView控件,可以向匿名用户和登录用户显示不同的信息。LoginView控件还包括ViewChanging和ViewChanged的事件,我们可以为这些事件编写当用户登录或更改状态时的处理 程序。
· LoginStatus控件
LoginStatus控件为没有通过身份验证的用户显示登录链接,为通过身份验证的用户显示注销链接。登录链接将用户带到登录页。注销链接将当前用户的身份重置为匿名用户。
· LoginName控件
如果用户已使用ASP.NET成员资格登录,LoginName控件将显示该用户的登录名。或者,如果站点使用集成Windows身份验证,该控件将显示用户的Windows账户名。在15.6节中,我们将以实际的例子来演示如何使用这些控件。
15.5.6 ASP.NET网站管理工具
网站管理工具使你能够通过简单的 Web 界面查看并管理网站配置。网站管理工具提供一个选项卡式界面,该界面在每个选项卡中对相关的配置设置进行分组。在15.7节中,我们将重点介绍如何使用ASP.NET网站管理工具来配置应用程序安全。
· 安全选项卡
使用“安全”选项卡管理访问规则,以便帮助保证网站中特定资源的安全,并对用户账户和角色进行管理。可以指定如何使用网站——从Internet中使用(公共),或者从Intranet中使用(在局域网上)。这进而可指示网站将使用的身份验证模式的类型。Internet网站使用ASP.NET成员资格系统,即定义单个的用户账户。ASP.NET使用一个安全系统,以限制对一些特定的用户账户或这些用户账户所属的角色的访问。Intranet网站使用Windows身份验证,即用户由Windows登录信息标识。
· 应用程序选项卡
使用“应用程序”选项卡管理与网站相关的各种设置,包括如下。
应用程序设置。这些设置是需要集中存储并可从网站任何地方以代码形式访问的一些名称/值对。
SMTP设置。确定站点如何发送电子邮件。
调试和跟踪设置。
脱机和联机设置。使网站脱机(将其关闭)以执行维护,或使一个新的Microsoft SQL Server标准版的数据库联机。
· 提供程序选项卡
使用“提供程序”选项卡,以测试或指定网站的成员资格和角色管理的提供程序。数据库提供的程序是一些经调用以存储特定功能的应用程序数据的类。默认情况下,网站管理工具在网站的 App_Data 文件夹中配置并使用一个本地Microsoft SQL Server标准版数据库。相反,可以选择使用不同的提供程序(如远程SQL Server数据库),以存储成员资格和角色管理。
15.5.7 成员资格和角色管理器API编程
有时候,需要对成员身份进行更高级别(比Web站点管理工具或Login控件提供的控制级别高)的控制。在这些情况下,可以直接使用Membership API。Membership API是通过Membership类公开的。Membership类包含的方法使你能够完成以下工作:创建新用户、更改密码、搜索与特定条件匹配的用户等。其实在幕后,Login 控件使用这些方法与已配置的成员身份提供程序进行交互。还有的时候,我们需要自己制作程序来进行角色管理,同样可以使用角色管理API来编程。
在15.8节中我们会以实际的代码来演示如何进行这些API的编程。