ASP.NET 角色管理使您可以轻松地将多个不同的提供程序用于您的 ASP.NET 应用程序。可以使用 .NET Framework 中包含的配置文件提供程序,也可以实现自己的提供程序。
主要有两个原因需要创建自定义角色提供程序。
-
需要将角色信息存储在 .NET Framework 中包含的角色提供程序所不支持的数据源中,如 FoxPro 数据库、Oracle 数据库或其他数据源。
-
需要使用不同于 .NET Framework 包含的提供程序所使用的数据库架构来管理角色信息。一个常见的示例是已存在于公司或网站的 SQL Server 数据库中的授权数据。
必需的类
若要实现角色提供程序,请创建一个继承 System.Web.Security 命名空间中 RoleProvider 抽象类的类。RoleProvider 抽象类继承 System.Configuration.Provider 命名空间的 ProviderBase 抽象类。因此,也必须实现 ProviderBase 类所需的成员。下表列出了必须实现的从 ProviderBase 和 RoleProvider 抽象类继承的属性和方法,并提供了每个属性和方法的说明。若要查看每个成员的实现,请参见为角色提供程序实现示例提供的代码。
ProviderBase 成员
成员 | 说明 |
---|---|
Initialize 方法 | 接受提供程序的名称和配置设置的 NameValueCollection 作为输入。用于设置提供程序实例的属性值,其中包括特定于实现的值和配置文件(Machine.config 或 Web.config)中指定的选项。 |
RoleProvider 成员
成员 | 说明 |
---|---|
使用配置文件 (Web.config) 中指定的角色信息的应用程序的名称。ApplicationName 存储在带有相关用户信息的数据源中,并在查询用户信息时使用。有关更多信息,请参见本主题后面的有关 ApplicationName 的部分。 如果未明确指定,则此属性是读写,并且默认值为 ApplicationPath。 | |
接受用户名列表和角色名列表作为输入,然后将指定的用户与在已配置的 ApplicationName 的数据源中指定的角色关联。 如果对于已配置的 ApplicationName 不存在任何指定的角色名或用户名,则应引发 ProviderException。 如果任何指定的用户名或角色名为空字符串,则应引发 ArgumentException,如果任何指定的用户名或角色名为 null(在 Visual Basic 中为 Nothing),则应引发 ArgumentNullException。 如果数据源支持事务,则应在事务中包含每个添加操作,并且如果添加操作失败,则应回滚事务并引发异常。 | |
CreateRole 方法 | 接受角色名作为输入,并将指定的角色添加到已配置的 ApplicationName 的数据源中。 如果对于已配置的 ApplicationName 已存在指定的角色名,则应引发 ProviderException。 如果指定的角色名为空字符串、包含逗号或超过数据源所允许的最大长度,则应引发 ArgumentException;如果指定的角色名为 null(在 Visual Basic 中为 Nothing),则应引发 ArgumentNullException。 |
DeleteRole 方法 | 接受角色名以及一个指示如果仍有用户与该角色关联时是否引发异常的布尔值作为输入。DeleteRole 从已配置的 ApplicationName 的数据源删除指定的角色。 如果 throwOnPopulatedRole 参数为 true,且由角色名参数标识的角色具有一个或一个以上成员,则引发 ProviderException,并且不删除该角色。如果 throwOnPopulatedRole 参数为 false,则不论该角色是否为空,都会删除角色。 从数据源删除角色时,确保也删除用户名与已配置的 ApplicationName 的已删除的角色之间的任何关联。 如果指定的角色名不存在,或为空字符串,则应引发 ArgumentException。如果指定的角色名为 null(在 Visual Basic 中为 Nothing),则应引发 ArgumentNullException。 |
接受角色名和要搜索的用户名作为输入,并返回角色中的用户列表,其中的用户名包含与为已配置的 ApplicationName 提供的 usernameToMatch 匹配的部分。根据数据源提供通配符支持。根据用户名按字母顺序返回用户。 如果数据源中不存在指定的角色名,则建议引发 ProviderException。 | |
GetAllRoles 方法 | 从数据源返回角色名的列表。仅检索指定的 ApplicationName 的角色。 如果已配置的 ApplicationName 不存在任何角色,则应返回不带任何元素的字符串数组。 |
接受用户名作为输入,并从数据源返回与指定的用户关联的角色名。仅检索已配置的 ApplicationName 的角色。 如果已配置的 ApplicationName 对于指定用户不存在任何角色,则应返回不带任何元素的字符串数组。 如果指定的用户名为空字符串,则应引发 ArgumentException。如果指定的用户名为 null(在 Visual Basic 中为 Nothing),则应引发 ArgumentNullException。 | |
接受角色名作为输入,并从数据源返回与角色关联的用户名。仅检索已配置的 ApplicationName 的角色。 如果对于已配置的 ApplicationName 不存在指定的角色名,则应引发 ProviderException。 如果没有与已配置的 ApplicationName 的指定角色关联的用户,则应返回不带任何元素的字符串数组。 如果指定的角色名为空字符串、包含逗号或超过数据源所允许的角色名的最大长度,则应引发 ArgumentException。如果指定的角色名为 null(在 Visual Basic 中为 Nothing),则应引发 ArgumentNullException。 | |
IsUserInRole 方法 | 接受用户名和角色名作为输入,并确定当前登录用户是否与已配置的 ApplicationName 的数据源中的角色关联。 如果对于已配置的 ApplicationName 不存在指定的角色名或用户名,则应引发 ProviderException。 如果指定的用户名或角色名为空字符串,则应引发 ArgumentException,如果指定的用户名或角色名为 null(在 Visual Basic 中为 Nothing),则应引发 ArgumentNullException。 |
接受用户名列表和角色名列表作为输入,然后删除指定用户与在已配置的 ApplicationName 的数据源中的指定角色的关联。 如果对于已配置的 ApplicationName 不存在任何指定的角色名或用户名,则应引发 ProviderException。 如果任何指定的用户名或角色名为空字符串,则应引发 ArgumentException,如果任何指定的用户名或角色名为 null(在 Visual Basic 中为 Nothing),则应引发 ArgumentNullException。 如果数据源支持事务,则应在事务中包含每个删除操作,并且如果删除操作失败,则应回滚事务并引发异常。 | |
RoleExists 方法 | 接受角色名作为输入,并确定在已配置的 ApplicationName 的数据源中是否存在该角色名。 如果指定的角色名不存在,或为空字符串,则应引发 ArgumentException。如果指定的角色为 null(在 Visual Basic 中为 Nothing),则建议引发 ArgumentNullException。 |
ApplicationName
角色提供程序为每个应用程序单独存储角色信息。这允许多个 ASP.NET 应用程序使用相同数据源,而在使用重复用户名时不会发生冲突。或者,多个 ASP.NET 应用程序可以通过指定同一 ApplicationName 来使用同一角色数据源。
因为角色提供程序单独为每个应用程序存储角色信息,所以需要确保数据架构包含应用程序名,并确保查询和更新也包含应用程序名。例如,以下命令用于从数据库中检索角色名,并确保在查询中包括 ApplicationName。
SELECT Rolename FROM Roles WHERE Rolename = 'Administrators' AND ApplicationName = 'MyApplication'
线程安全
对于应用程序的配置文件中指定的每个角色提供程序,ASP.NET 都会实例化单个角色提供程序实例,该实例用于 HttpApplication 对象所服务的所有请求。因此,可以有多个请求并发执行。ASP.NET 不保证对提供程序的调用的线程安全。因此需要编写线程安全的提供程序代码。例如,创建一个与数据库的连接或打开一个文件用于编辑,这些均应在被调用的成员(如 AddUsersToRoles)内完成,而不是在调用 Initialize 方法时打开文件或(创建)数据库连接。