ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理

Membership类

  以Membership类的静态方法为中心的成员管理编程接口封装了凭据和其他用户信息的获取、比较操作细节。

  Membership类默认使用的提供程序将用户信息以预定义的格式存储在SQL Express数据库中。如果希望使用自定义的数据存储(如个人数据库),我们可以创建自定义的提供程序,并将其插入到应用程序中。

Membership类的编程接口

  下表列出了Membership类的属性:

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第1张图片

  Provider属性返回当前使用的成员资格提供程序的引用,该提供程序是在配置文件中选定的。ASP.NET自带了两个预定义的提供程序,分别面向SQL Server Express和活动目录。我们可以从Microsoft和第三方厂商获得更多成员资格提供程序,也可以自己编写。我们还可以通过Providers集合来获取给定应用程序中所有已安装的成员资格提供程序。

  所有属性都是静态的、只读的。这些属性的实现都很简单,只是访问当前提供程序只对应的成员。例如:

  
  
public static int PasswordAttemptWindow
{
get
{
Membership.Initialize();
return Membership.Provider.PasswordAttemptWindow;
}
}

  Initialize方法用于确保Membership类的内部结构能被正确地初始化,并引用现有的提供程序。

  UserIsOnlineTimeWindow属性的值用来确定当前使用应用程序的用户的数目,也就是我们经常在各论坛上看到的当前在线用户数。如果某用户在上一个时间窗内操作了应用程序,那么他便会被视为联机。UserIsOnlineTimeWindow属性的默认值为15分钟,如果该用户在15分钟内无任何操作,将被视为脱机。

  下表列出了Membership类的方法:

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第2张图片

成员资格的建立

  Visual Studio中的网站管理工具(Web Site Administration Tool,WSAT)提供了一套用户界面,能够创建和管理应用程序中已注册用户。

用户的验证

  使用成员资格系统进行用户验证的示例代码如下:

  
  
void LononUser( object sender, EventArgs e)
{
string user = userName.Text;
string pswd = passWord.Text;

// 验证用户
if (Membership.ValidateUser(user, pswd))
FormsAuthentication.RedirectFromLoginPage(user,
false );
else
errorMsg.Text
= " Sorry, yours seems not to be a valid account. " ;
}

  ValidateUser函数内部伪代码如下:

  
  
public static bool ValidateUser( string username, string password)
{
return Membership.Provider.ValidateUser(username, password);
}

  从上面可看出,所有执行身份验证的核心功能都位于提供程序中,这样设计的优点是:提供程序的名称定义在web.config文件中,若要更换提供程序,不必修改应用程序的源.

成员资格提供程序

  成员资格模型的优点不仅在于能通过非常紧凑的代码来验证和管理用户,还在于它的抽象性和可扩展性。如果我们要编写一个自定义的数据提供程序,我们要做的仅仅是实现一个继承于MembershipProvider的类即可。通过这种方式能够成功的将现有的身份验证相关代码迁移到新版本的成员资格提供程序中。

ProviderBase类

  ASP.NET中的所有提供程序都继承于ProviderBase类,该类提供一个Initialize方法和一个Name属性。Name属性返回提供程序的正式名称。Initialize方法接受提供程序的名称和一个键/值对集合,该集合存储的是提供程序配置区段的内容,该方法从web.config文件中读取配置区段的值来对内部状态进行初始化。

MembershipProvider类

  Membership类的许多方法和属性需调用底层提供程序对应的方法。因此,MembershipProvider中的方法对应于独立的Membership类实现的方法。

  MembershipProvider类的方法见下表:

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第3张图片

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第4张图片

  该类中的这些方法都被标记为abstract或virtual。

  MembershipProvider支持的属性见下表:

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第5张图片

编写提供程序需注意的问题

  编写提供程序时,有3上问题要注意:提供程序的生存期、线程安全和原子性。

  提供程序应该只在需要时实例化,但在ASP.NET应用程序的生存期只发生一次。这个过程会为提供程序组件设置状态,但应注意多线程访问。

  提供程序不是线程安全的,我们应确保访问所有关键数据前对其进行锁定。

  提供程序中的某些功能可能由多个步骤组成,开发者应确保整个操作的原子性,这可以通过数据库事务来实现,也可以通过锁定机制来实现。

成员资格提供程序的配置

  我们可通过web.config的<membership>区段来注册新的提供程序:

  
  
< membership >
< providers >
< add name = " MyMembershipProvider "
type
= " ProAspNet20.MyMembershipProvider " />
</ providers >
</ membership >

  通过<membership>区段的defaultProvider属性,我们可更改默认的提供程序。

角色的管理

  ASP.NET角色是一个字符串,指向用户在应用程序上下文中扮演的逻辑角色。经一系列配置,每个用户可被赋予若干角色,这些信息存储在用户的标识对象中,应用程序可在执行关键操作前对其进行检查。

  角色管理程序负责维护用户与角色之间的关系。

角色管理编程接口

  对角色管理、定义、为用户添加角色和创建访问规则进行配置,最简单的方法是利用WSAT。为启用角色管理,向应用程序的web.config文件中添加以下配置:

  
  
< roleManager enabled = " true " />

  我们可以通过角色建立页面和文件夹的访问规则。下面的<authorization>块指出,只有Admin成员才能访问所有由web.config文件控制的页面:

  
  
< configuration >
< system.web >
< authorization >
< allow roles = " Admin " />
< deny users = " * " />
</ authorization >
</ system.web >
</ configuration >

  <allow>和<deny>的顺序很重要。“允许”和拒绝操作会按照配置文件中相应设置的顺序进行处理。

Roles类

  若启用角色管理,ASP.NET会创建Roles类的实例,并将其添加到当前用户的请求上下文--HttpContext对象。下表列出了Roles类的主要方法:

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第6张图片

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第7张图片

  下表列出了Roles类的属性,所有属性都是静态的,且是只读的,反映的是<roleManager>配置区段的设置:

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第8张图片

  角色管理要使用角色管理器HTTP模块,该模块负责将用户的角色信息添加到当前标识对象。它会监听AuthenticateRequest事件,并执行相应的代码。

角色提供程序

  角色提供程序是一个继承于RoleProvider的类,其架构与成员资格提供程序的架构没有太大区别。下表对RoleProvider类的方法做了简要说明:

ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理_第9张图片

  ASP.NET自带了几个角色提供程序--SqlRoleProvider(默认)、WindowsTokenRoleProvider和AuthorizationStoreRoleProvider。

  WindowsTokenRoleProvider基于用户的Windows域,这种提供程序不允许添加或移除角色。

  AuthorizationStoreRoleProvider类能利用授权管理器(通常筄为AzMan)策略存储区来管理角色信息的存储。它是一个单独下载的Windows组件。

  自定义的角色提供程序可以从RoleProvider派生,并通过<roleManager>区段的<providers>子区段进行注册,其过程与上文讲解的成员资格提供程序基本相同。

你可能感兴趣的:(asp.net)