ASP.net 2.0 的 Membership Provider 與 Role Provider 第二部分

來源:互聯網
上載者:User
文章目錄
  • Role Providers 
  • 整合
  • 結論
 ASP.net 2.0 的 Membership Provider 與 Role Provider 第二部分     原文地址:http://odetocode.com/Articles/428.aspx
翻譯:歐盟特軟體技術公司 紀俊

在第一部分我們討論了 Provider 模型,授權與 SqlMembershipProvider 類。在這篇文章我們將把精力放到 Role Provider 與授權。

一旦確定了使用者身份,您需要決定的將會是允許使用者做什麼和允許他們訪問哪些頁。通常我們系統管理權限的技術是將使用者分如不用的組或者角色,並且根據使用者的角色來分配許可權。舉例來說,您的應用程式可能有10000名註冊使用者但僅僅分為三種角色:管理員、註冊使用者與匿名使用者。使用角色來減少網站啟動並執行管理操作。當您想要授權或者限制網站所有的註冊使用者,你僅僅需要設定某個角色的許可權並且不會影響到其他的使用者帳號。

典型的,我們使用 web.config 檔案來允許與禁止使用者組來訪問檔案與檔案夾。這些配置資訊在 web.config 的 <authorization> 段類似 <allow roles= "Administgrators"> 的元素。相比於列出各個使用者帳號使用角色可以更容易的覆蓋更多組的使用者。ASP.net 2.0 中,您可以使用 ASP.NET Web Site Administration Tool 來定義這些授權配置。

RoleProvider 類是所有 Role Provider 得基類。正如我們在第一部分提到的,RoleProvider 類定義了所有 ASP.net 2.0 Role Provider 的協議。它包括建立與刪除角色、添加與刪除角色中的使用者以及檢查給定使用者的角色許可權的方法。它的目的在於定義您在程式中執行授權檢查會用到的所有方法。如果 ASP.net 中沒有您需要的 Role Provider(您可能要在 Oracle 中儲存使用者角色許可權),您可以自己寫自己的 Provider(從 RoleProvider)並且將您的組件加入到 ASP.net 中。

如果您想與 Role Provider 互動,使用 System.Web.Security 命名空間的 Roles 類。靜態 Roles 類提供了調用當前配置的 Role Provider 得方法與屬性。例如,Roles.GetAllRoles 會調用當前 Role Provider 的 GetAllRoles 方法來獲得全部有效角色名稱字串數組。如果您進行中授權檢查,Roles.IsUserInRole 方法會提供很大協助。

Role Providers 

每個 Role Provider 都與不同的資料來源互動。

System.Web.dll 打包的每個 Role Provider 包括 SqlRoleProvider,就像第一部分提到的 SqlMembershipProvider,在 SQL Server 資料庫中儲存角色資訊。

WindowsTokenRoleProvider 從 Windows 使用者組資訊中獲得角色資訊。WindowsTokenRoleProvider 是唯讀(您不能建立新角色、或者修改角色的許可權),但在程式使用 Windows 授權與禁止匿名訪問時很有用。

AuthorizationStoreRoleProvider 與 Microsoft Authorization Manager (AzMan)共同協助。AzMan 可以使用儲存在 XML 檔案或者是 Active Directory 的角色資訊。AuthorizationStoreRoleProvider 可以在區域網路與廣域網路應用程式中的非常好但是在一個部分信任環境中運行卻非常困難。

配置

ASP.net 中的 Role Manager 預設是關閉的。您可以在網站管理工具的安全頁內開啟 Role Manager,浙將在程式的 web.config 檔案中添加如下一段:

 

<system.web>

  <roleManager enabled="true" />

</system.web>

 

在 machine.config 中有預設的 Provider 配置:

 

<roleManager>

  <providers>

    <add name="AspNetSqlRoleProvider"

        connectionStringName="LocalSqlServer"

        applicationName="/"

        type="System.Web.Security.SqlRoleProvider, ..." />

    <add name="AspNetWindowsTokenRoleProvider"

        applicationName="/"

        type="System.Web.Security.WindowsTokenRoleProvider, ..." />

  </providers>

</roleManager>

 

注意 LocalSqlServer 連接字串是 SqlRoleProvider 的預設連接字串。正如我們在第一部分提到的那樣,LocalSqlServer 是 machine.config 中定義的指向 App_data 路徑下名為 aspnetdb SQL Server Express 資料庫的連接字串。如果您的 SqlRoleProvider 與 SqlMembership Providers 使用 App_Data 以外的資料庫,您首先要使用 aspnet_regsql.exe 工具(在 \Windows\Microsoft.NET\Framework\v2.0.xxxx 路徑下可以找到,這裡的 xxxx 是目前的版本的最後四個數字 )。更詳細的資料請參考本文章的第一部分。

SqlRoleProvider 的 applicationName 屬性在使用非 App_Data 資料庫時配置起來很重要。如果您有兩個網站應用程式程式需要共用角色許可權資訊,讓兩個程式的 applicationName 一樣並讓它們指向同一個資料庫執行個體。如果您想讓程式適用同一個資料庫但是並不共用角色許可權資訊,讓兩個程式的 applicationName 不同。applicationName 屬性將資料限定在特定的網站應用程式程式中。

讓我們來看下 web.config 檔案中配置 Membership Provider 與 Role Provider 使用本機伺服器上名為 aspnetdb 的 SQL Server 資料庫的例子。

 

<?xml version="1.0"?>

<configuration>

 

  <connectionStrings>

    <add name="MyAspNetDB"

        connectionString="server=.;database=aspnetdb;integrated security=true"/>

  </connectionStrings>

 

  <system.web>

    <roleManager enabled="true">

        <providers>

            <clear/>

            <add name="AspNetSqlRoleProvider" connectionStringName="MyAspNetDB"

                applicationName="/SampleRolesApp"

                type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

        </providers>

    </roleManager>

    <membership>

        <providers>

            <clear/>

            <add name="AspNetSqlMembershipProvider"

                connectionStringName="MyAspNetDB"

                enablePasswordRetrieval="false"

                enablePasswordReset="true"

                requiresQuestionAndAnswer="true"

                applicationName="/SamplesRolesApp"

                requiresUniqueEmail="false"

                passwordFormat="Hashed"

                maxInvalidPasswordAttempts="5"

                minRequiredPasswordLength="7"

                minRequiredNonalphanumericCharacters="1"

                passwordAttemptWindow="10"

                passwordStrengthRegularExpression=""                     

                type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

        </providers>

    </membership>

 

    <authentication mode="Forms" />

 

  </system.web>

</configuration>

 

第一步是為 ASP.net 資料庫定義連接字串來定位。我們可以啟用 roleManager 並去掉所有之前存在的從更高層設定繼承過來的 Provider。如同這個檔案配置的 Membership Provider 一樣,這裡的connectionStringName 與 applicationName 屬性設定為同一個資料庫與應用程式名稱。

如果您想使用 WindowsTokenRoleProvider,不需要做任何配置。它不需要資料庫並且只能讀取 Windows 的使用者群組成員許可權資訊。使用 WindowsTokenRoleProvider 您僅僅需要在 web.config 中添加如下一句(在網站管理程式的 Providers 頁也能進行配置)。

 

<roleManager enabled="true"

            defaultProvider="AspNetWindowsTokenRoleProvider"/>

 

正如我們之前提到的,AuthorizationStoreRoleProvider 使用 AzMan。關於它的更詳細的資訊請參考“How To Use Authorization Manager from ASP.NET”與 “How To Use Active Directory Application Mode (ADAM) from ASP.NET”。

整合

一旦您配置好了 Role Provider,就該把角色資訊添加到程式中,並設定對應的許可權。使用 web.config 我們可以使網站應用程式程式的訪問者限定在某些地區的特定角色。例如:將下面一段放入 web.config 會讓其目錄只能被 Admin 角色的使用者瀏覽。

 

<system.web>

  <authorization>

    <allow roles="Admin"/>

    <deny users="*"/>

  </authorization>

</system.web>

 

寫程式時使用 IsUserInRole 您可以對許可權作細微的檢查。

 

If Roles.IsUserInRole("Admin") Then

 

' perform an admin action

 

Else

 

' give user an error message

 

End If

 

您也可以使用 PrincipalPermission 屬性來顯式的查詢使用者是否屬於某一角色。您可以在一個類或者一個方法中使用這個屬性。如果當前的使用者不屬於這個角色,代碼不會執行並且會拋出一個異常。

 

<PrincipalPermission(SecurityAction.Demand, Role:="Registered")> _

Protected Sub DoSomethingImportant()

 

    ' ...

 

End Sub

 

結論

ASP.net 2.0 中可擴充的 Provider 模型實現了我們很多年來需要自己編寫的功能 - 就像 Membership 與 Role Management。這種模型可以配置、擴充,也就是說當工具列內沒有我們需要的 Provider 的時候我們可以自己編寫代碼來擴充它。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.