阅读提要 在缺省状况下,你只能使用Visual Studio 2005的一个本机实例来 管理与ASP.NET 2.0一同发行的SQL Server数据库中的安全凭证。本文将向你展 示怎样用一个Web服务来包装ASP.NET 2.0提供者并通过使用一个Windows表单应 用程序来管理凭证存储从而扩展这种管理能力。
如今,无论是互联网还是企业内部局域网程序一般都要求使用定制的方式来 存储和管理用户帐户和角色。为此,ASP.NET 2.0提供了一个现成的提供者模型 和一个SQL Sever数据库。不幸的是,只能通过Visual Studio 2005来管理该凭证数据库且只能针对本机Web应用程序。这无疑是非常不方便而且不能广泛使用 的。
本文描述了一个超级用户可以使用的完全定制的安全管理应用程序。这个应 用程序通过用一个WEB服务对ASP.NET 2.0提供者进行了包装并增加了一些功能。 本文详细描述了其中的设计方法,面临的问题和包含在应用程序中的技术。同时 还向你介绍了一些有用而强有力的技术,如基于接口的Web服务,基于反射的Web 服务兼容性,高级C# 2.0编程,Web服务安全性和Web服务事务等。
一、ASP.NET 2.0凭证基础结构
基于互联网的应用程序常常不依赖Windows帐户和组,而是依赖于基于表单的 认证并结合某种如SQL Server的后台定制凭证存储。为了帮助开发者免除重复设 计和构建这样的解决方案,ASP.NET 2.0发行中加入了一个现成的安全凭证基础 结构。ASP.NET 2.0凭证存储并不仅可用于ASP.NET应用程序,而且ASP.NET Web 服务和Windows表单应用程序都能使用它来管理它们的用户凭证。另外,Windows 通讯基础(编码名为Indigo)服务也能被容易地设置来使用ASP.NET 2.0安全凭证 存储。
ASP.NET 2.0使用一提供者模型来访问和管理凭证以避免把应用程序耦合到任 何特定存储上。在利用抽象提供者模型的优点的同时由程序员来开发这个应用程 序。超级用户负责选择和管理特定的凭证存储。图1显示出ASP.NET 2.0安全提供 者的架构。
图1.ASP.NET 2.0安全提供者模型
Membership Provider负责管 理用户,而Role Provider负责管理角色。在凭证存储中,每个用户或角色仅限 于一应用程序之内。这样就允许不同应用程序使用一样的凭证存储而不会与彼此 的用户名或角色相冲突。ASP.NET为SQL服务器、Windows和活动目录(见图1)等的 凭证存储提供支持。为了安装SQL Server凭证数据库,可以运行 aspnet_regsql.exe程序,其位置是:
<WINDOWS>\Microsoft.NET\Framework\<version>
这个安装程序创建一个称为 aspnetdb的新数据库-它包含一组应用程序的表、用户、角色以及存取这些表的 存储过程。这个SQL Server数据库是运用最新的安全技术经过精心设计的。另外 ,ASP.NET 2.0还提供一套相应于提供者的类(图1)。
使用哪个提供者 的信息被保存在应用程序的配置文件(App.Config或Web.Config)中。你几乎不需 要直接与特定的提供者进行交互;而是,存在两个静态助理类:Membership和 Roles-它们负责从配置文件中读取使用哪个提供者。默认的提供者(即当没有指 定提供者时)就是SQL Server。Membership类(列表1)允许你创建和删除用户, 检索关于用户的信息并观看口令策略。
列表1: Membership助理类
[Serializable]
public class MembershipUser{
public virtual bool ChangePassword(string oldPassword,string newPassword);
public virtual string GetPassword(string passwordAnswer);
public virtual string ResetPassword(string passwordAnswer);
public virtual bool UnlockUser();
//其它成员
}
public static class Membership{
public static string ApplicationName{get;set;}
public static MembershipUser CreateUser(string username, string password);
public static MembershipUser CreateUser(string username,
string password, string email, string passwordQuestion,
string passwordAnswer, bool isApproved, out MembershipCreateStatus status);
public static bool DeleteUser(string username,bool deleteAllRelatedData);
public static MembershipUser GetUser(string username);
public static void UpdateUser(MembershipUser user);
public static bool ValidateUser(string username,string password);
public static bool EnablePasswordReset{get;}
public static bool EnablePasswordRetrieval{get;}
//其它成员
}