尊重作者,请保留 www.it55.com 链接字样。
每一个完善的网站管理系统都应该包括用户管理、角色管理,都包含用户注册、密码修改、用户登录、身份验证等功能。在asp.net 1.x时代,程序员为了这些常用的功能反复做着重复性的工作,今天的asp.net 2.0替我们封装了这些常用控件及机制,给我们带来了诸多便利。接下来两节我们就来学习这方面的内容。
这一节我们讲述asp.net 2.0的成员资格和角色管理部分。
1、asp.net的身份验证方式
asp.net的身份验证方式有4种:Windows验证、Passport验证、None验证、Forms验证。在我们的Web应用程序开发中,Forms验证方式是最常用的,所以这里我们只涉及Forms验证。
asp.net 2.0网站的身份验证信息除了可以像常规程序那样保存在Cookie中之外,还提供了一种Url保存会话的方案,即“无Cookie会话功能”。“无Cookie会话功能”是为了避免客户端因为屏蔽了Cookie功能而无法进行身份验证的情况而设计的,但是这个功能同时也带来了安全隐患,所以仍然建议使用Cookie会话方案。
基于Forms的身份验证时,需要设置Web.config网站配置文件,设置<system.web>元素下的<authentication> 元素的 <forms> 子元素:
<authentication mode="Forms">
<forms name=".VS2005_Form" loginUrl="~/Security/Login.aspx" defaultUrl="~/Default.aspx"
protection="All" timeout="30" path="/" requireSSL="false"
slidingExpiration="true" enableCrossAppRedirects="false"
cookieless="UseDeviceProfile">
</forms>
</authentication>
<forms>元素的属性说明如下
1) cookieless - 身份验证可以将 Forms 身份验证票存储在 Cookie 中也可以以无 Cookie 的表示形式存储在 URL 上。有效值如下:
·UseDeviceProfile - 默认值表示 ASP.NET 根据预先计算得到的浏览器配置文件来确定存储票证的位置。
·AutoDetect - 选项使 ASP.NET 动态确定浏览器是否支持 Cookie。
·UseUri - 强制实施无 Cookie 票证
·UseCookies - 强制实施有 Cookie 票证。
2) defaultUrl - 指定在成功登录后,请求将重定向到的默认 URL。
3) domain - 指定包含 Forms 身份验证票的 HttpCookie 的 Domain 属性的值。显式设置此属性可使应用程序共享同一个 Cookie,前提是这些应用程序共享某个 DNS 命名空间的一个公共部分(例如,如果 domain 属性设置为“cnblogs.com”,则 webabcd.cnblogs.com 和 dudu.cnblogs.com可以共享一个 Cookie)。
4) enableCrossAppRedirects - Forms 身份验证允许以查询字符串变量或窗体 POST 变量的形式在应用程序之间传递 Forms身份验证票。将此属性设置为 true 可使 FormsAuthenticationModule 能够从查询字符串或窗体 POST 变量提取票证。
5) loginUrl - 指定未经身份验证的用户的请求将被重定向到的 URL。该 URL 可以在同一台计算机上或在远程计算机上。如果是在远程计算机上,则两台计算机上 machineKey 配置元素中的 decryptionkey 和 validationKey 属性都需要使用相同的值。
6) name - 用于身份验证的 HTTP Cookie 的名称。注意,如果多个应用程序需要在一台计算机上使用基于窗体的身份验证服务,并且每个应用程序都希望由应用程序隔离 Forms 身份验证 Cookie,则每个应用程序都应配置一个唯一的 Cookie 值。为避免在 URL 中产生依赖项,在设置身份验证 Cookie 时,ASP.NET 还使用“/”作为 Path 值,以便将这些 Cookie 发送回站点上的每个应用程序。
7) path - 用于发出的 Cookie 的路径。默认值为“/”,以避免路径中大小写不匹配的造成的困难,因为在返回 Cookie 时,浏览器是严格区分大小写的。共享服务器环境中的应用程序应使用此指令来维护专用 Cookie。(它们还可以使用 API 在运行时指定路径来发出 Cookie。)
8) protection - 用于保护 Cookie 数据的方法。有效值如下:
·All - 同时使用数据验证和加密来保护 Cookie。所配置的数据验证算法是基于 <machinekey> 元素的。如果密钥足够长(48 个字符),默认情况下将使用 AES 进行加密。All 是默认(和建议)值。
·None - 用于仅将 Cookie 用于个性化设置并且安全性要求不高的站点。加密和验证都可以被禁用。尽管以此方式使用 Cookie 需谨慎,但对于使用 .NET Framework 实现个性化设置的任何方法,此设置提供了最佳性能。
·Encryption - 使用 AES、TripleDES 或 DES 加密 Cookie,但不对 Cookie 进行数据验证。这类 Cookie 容易受到精心选择的纯文本的攻击。
·Validation - 不加密 Cookie 的内容,但验证 Cookie 数据在传输过程中是否未被更改。若要创建 Cookie,验证密钥在缓冲区中与 Cookie 数据连接,并且计算出 MAC 并将其追加到输出的 Cookie。
9) requireSSL - 如果设置为 true,则 Forms 身份验证会设置 Forms 身份验证 Cookie 的安全位。兼容的浏览器只将 Cookie 通过 SSL 连接发送回 ASP.NET。注意,如果使用无 Cookie Forms 身份验证,则此设置无效。
10) slidingExpiration - 如果设置为 true,则 Forms 身份验证将定期更新 Forms 身份验证票的生存期。无论票证是包含在 Cookie 中,还是以无 Cookie 的格式包含在 URL 中,都会进行此操作。
11) timeout - 时间量(以整数分钟为单位),经过该时间量之后,Cookie 则会过期。默认值是 30。超时属性是一个可调值,从收到上次请求的时间开始计算,它将在 n 分钟后过期。为了避免对性能产生负面影响,也为了避免那些打开了 Cookie 警告的应用程序产生多个浏览器警告,Cookie 在超时时间过半时更新。(这意味着在某些情况下可能会出现精度损失。) #p#分页标题#e#
2、用户授权。
在asp.net 2.0程序中,我们可以通过对Web.config文件进行配置,从而达到对访问权限的控制,配置方法如下:
<allow VERB="POST" users="2abcd@gmail.com" />
<allow roles="admin" />
<deny users="*" />
<allow VERB="GET" users="abc,xyz" />
<deny users="?" />
</authorization>
注:可以把授权用户和角色设置的配置写在某个文件夹内,则所做的配置只作用于该文件夹内,自动继承外面的配置。
allow - 允许
deny - 拒绝
users - 用户(多用户用逗号隔开)
roles - 角色(多角色用逗号隔开)
verb - 指定http方法,post或get
* - 所有用户
? - 匿名(未经过身份验证的)用户
我们还可以按路径对角色授权:
<location path="folder">
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</location>
<location path="abc.aspx">
<system.web>
<authorization>
<allow roles="Administrators" />
<deny users="*"/>
</authorization>
</system.web>
</location>
<location>元素的path属性可以是文件夹也可以是某一文件
3、成员资格管理
Membership类和MembershipUser类是成员资格管理API中的重要成员。利用它们,我们能够实现用户的验证、管理、信息检索等功能。但在使用它们之前,我们需要修改Web.config来对其进行配置。配置示例:
<membership defaultProvider="SqlMembershipProvider">
<providers>
<clear/>
<add name="SqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="SqlConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="3"
minRequiredPasswordLength="3"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordAnswerAttemptLockoutDuration="15"
passwordStrengthRegularExpression="" />
</providers>
</membership>
enablePasswordRetrieval - 是否可以检索用户密码(总是false)
enablePasswordReset - 是否允许用户重置其密码
requiresQuestionAndAnswer - 是否要求在创建用户时提供密码提示问题和答案#p#分页标题#e#
applicationName - 自定义成员资格提供程序的应用程序的名称
requiresUniqueEmail - 电子邮件地址是否必须是唯一的
passwordFormat - 存储的密码的格式
maxInvalidPasswordAttempts - 用户回答密码重置问题时允许失败的次数
minRequiredPasswordLength - 密码所要求的最小长度
minRequiredNonalphanumericCharacters - 有效密码中必须包含的最少特殊字符数
passwordAttemptWindow - 连续未能正确回答密码重置问题的次数进行跟踪的时间长度(单位:分钟)
passwordAnswerAttemptLockoutDuration - 用户多次未能正确回答密码提示问题后用户帐户的锁定时间长度(单位:分钟)
passwordStrengthRegularExpression - 用于验证密码的正则表达式
Membership类部分功能实现代码示例:
创建新用户:
try{
Membership.CreateUser ("name", "password", "mail");
}
catch (MembershipCreateUserException e)
{
// 失败
switch (e.StatusCode)
{
case MembershipCreateStatus.DuplicateUsername:
……;
case MembershipCreateStatus.DuplicateEmail:
……;
case MembershipCreateStatus.InvalidPassword:
……;
default:
……;
}
}
登录验证:
if (Membership.ValidateUser (UserName.Text, Password.Text))
FormsAuthentication.RedirectFromLoginPage (UserName.Text, RememberMe.Checked);
可以使用的方法:CreateUser(创建用户) DeleteUser(删除用户) GeneratePassword(生产随即密码) GetAllUsers(得到用户) GetUser(查看某个用户) UpdateUser(修改用户) ValidateUser(验证是否成功)
MembershipUser类部分功能实现代码示例:
挂起登录权限:
if (Membership.ValidateUser (UserName.Text, Password.Text)) {
MembershipUser user = Membership.GetUser (UserName.Text);
user.Comment = "0"; //记录登录次数
RedirectFromLoginPage (UserName.Text, RememberMe.Checked);
}
else {
MembershipUser user = Membership.GetUser (UserName.Text);
if (user != null) {
string count = Convert.ToInt32 (user.Comment) + 1;
user.Comment = count.ToString ();
}
}
它的一些方法和属性:
属性:Comment CreationDate Email LastLoginDate LastPasswordChangedDate UserId UserName
方法: ChangePassword ChangePassword-QuestionAndAnswer GetPassword ResetPassword
4、角色管理
若要实现角色管理,必须首先对Web.config文件中的<roleManager>配置节进行配置:
<roleManager defaultProvider="SqlRoleProvider"
enabled="true"
cacheRolesInCookie="true"
cookieName=".VS2005_Role"
cookieTimeout="30"
cookiePath="/"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
cookieProtection="All">
<providers>
<add
name="SqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="SqlConnectionString"
applicationName="/" />
</providers>
</roleManager>
cacheRolesInCookie :指定当验证某个用户是否在特定角色中时,先检查 Cookie,然后使用角色提供程序在数据源中检查角色列表。如果为 true,则缓存当前用户的 Cookie 中的角色名称列表;否则为 false。 默认值为 false。 #p#分页标题#e#
cookieName:指定存储角色名称的 Cookie 的名称。默认值为 ".ASPXROLES"。
cookiePath :角色名称 Cookie 的路径。 默认值为 "/"。
cookieProtection:指定 CookieProtection 枚举值之一。默认值为 All 值。
cookieRequireSSL:指定角色名称 Cookie 是否需要使用 SSL 来发送到服务器。如果设置为 true,则角色名称 Cookie 需要使用 SSL 来发送到服务器。 默认值为 false。
cookieSlidingExpiration:指定是否将定期重置角色名称 Cookie 的过期日期和时间。如果设置为 true,则 Cookie 的过期日期和时间最初将设置为当前日期和时间与 CookieTimeout 值(分钟)的加和。当用户继续主动地使用 ASP.NET 应用程序时,Cookie 的过期日期和时间将在剩余时间不足 CookieTimeout 值的一半时自动更新。有关更多信息,请参见 Expires。默认值为 true。
cookieTimeout:角色名称 Cookie 过期之前的时间(分钟)。默认值为 "30"(分钟)。
createPersistentCookie:指定角色名称 Cookie 是否为会话 Cookie;即,该 Cookie 会在浏览器关闭时丢失。如果设置为 true,则角色名称 Cookie 是可跨多个浏览器会话使用的持久性 Cookie。持久性 Cookie 的过期日期和时间设置为当前的日期和时间与 CookieTimeout 值(分钟)的加和。默认值为 false。
defaultProvider:默认角色提供程序的名称。有关更多信息,请参见 Provider。默认值为 "AspNetSqlRoleProvider"。
domain:指定角色名称 Cookie 的 Domain 值。默认值为 HttpCookie 属性默认值,该值为空字符串 ("")。
enabled:指定是否要启用角色管理。如果设置为 true,则启用角色管理。在 Machine.config 文件中,默认值为 false。
maxCachedResults:指定缓存在角色 Cookie 中的角色名称的最大数目。默认值为 25。
角色管理的API包括很多类,例如:Roles、RolePrincipal、RoleManagerEventArgs、RoleManagerModule等,其中Roles类是最重要的也是最常用的。
Roles类常用的方法:AddUserToRole CreateRole DeleteRole GetRolesForUser(查看用户角色) GetUsersInRole IsUserInRole RemoveUserFromRole
因为本节相关属性、方法、事件众多,所以这里只能尽可能地把常用的东东摆出来,如果有不明白的地方请自行搜索,google一下。
成员资格源代码:
upload/2007_05/07051722446157.rar
角色管理源代码:
upload/2007_05/07051722442920.rar
注:以上代码取自《ASP.NET 2.0开发指南》一书,感谢原作者
下一节:登录系列控件