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 方法時打開文件或(創建)數據庫連接。