Share via


了解角色管理

更新:2007 年 11 月

角色管理協助您管理授權,可讓您指定應用程式中的使用者可以存取的資源。角色管理可讓您將使用者指派為經理、業務、會員等角色,將一群使用者視為一個單位。(在 Windows 中,您可將使用者指派給 Administrators、Power Users 等群組來建立角色)。

在建立角色之後,您就可以在應用程式中建立存取規則。例如,您的網站可能包含一組您只想顯示給成員的頁面。同樣地,您可能會視目前使用者是否為管理員,而向他顯示或隱藏頁面的一部分。您可以利用角色建立這些類型的規則,而不受個別應用程式使用者的影響。例如,您不需要逐一授予網站的每個成員來存取僅限成員使用的網頁。相反地,您可以授予成員角色的存取權限,然後隨著人員註冊而在這個角色中加入和移除使用者,或任由其成員資格失效。

使用者可以屬於一個以上的角色。例如,如果您的網站是討論區,部分使用者可能會同時具備會員和版主這兩個角色。您可以將每一個角色定義為具有網站的不同權限,如此一來,同時具有這兩種角色的使用者就會同時具有這兩組權限。

即使應用程式只會有少數使用者,您仍然可以發現建立角色是一種非常便利的做法。角色可讓您彈性地變更使用權限,並且加入和移除使用者,而不必對整個網站進行變更。當您為應用程式定義更多的存取規則時,角色將變成更便利的方法,讓您能輕易地將變更套用到使用者群組。

角色和存取規則

建立角色的主要目的是讓您更容易管理使用者群組的存取規則。您可以建立使用者,再將使用者指派給角色 (在 Windows 中是指派給群組)。典型的使用情況便是您建立了一組頁面,但想限制只有某些使用者才能存取這些頁面。通常您會將這些受限制的頁面隔離在個別的資料夾中。然後,您可以建立規則,以授予和拒絕對受限制資料夾的存取權。例如,您可以設定網站,使成員或管理員可以存取受限制資料夾中的頁面,但是拒絕所有其他使用者對這些頁面的存取。如果未經授權的使用者嘗試檢視受限制的頁面,則使用者會看到錯誤,或被重新導向到您所指定的頁面。

角色管理、使用者識別和成員資格

若要使用角色,您必須能夠辨識應用程式中的使用者,如此才能判斷使用者是否具有特定角色。您可以設定應用程式以兩種方式來建立使用者識別 (Identity):Windows 驗證和表單驗證。如果您的應用程式是在區域網路 (也就是網域架構的內部網路應用程式) 中執行,則可以用 Windows 網域帳戶名稱來辨識使用者。在這種情況下,使用者的角色就是使用者所屬的 Windows 群組。

在網際網路應用程式或其他不適合使用 Windows 帳戶的情況下,您可以使用表單驗證來建立使用者識別。執行這項工作時,您通常需要建立頁面,讓使用者可在其中輸入使用者名稱和密碼,然後驗證使用者的認證。ASP.NET 登入控制項可為您執行大部分這項工作,或者您可以建立登入頁面,然後使用 FormsAuthentication 類別 (Class) 來建立使用者識別。

注意事項:

如果使用者沒有在您的應用程式中建立識別 (也就是匿名使用者),就不能使用角色。

如果您使用 Login 控制項或表單驗證來建立使用者識別,也可以搭配成員資格來使用角色管理。在這個案例中,您可以使用成員資格來定義使用者和密碼。然後,您可以使用角色管理來定義角色,並將成員指派給這些角色。不過,角色管理未相依於成員資格。只要您有辦法在應用程式中設定使用者識別,您就可以使用角色管理來進行授權。

角色管理和 ASP.NET 角色服務

您可以使用 ASP.NET 角色服務,以 Windows Communication Framework (WCF) 服務的方式存取角色。角色服務可讓您從任何可讀取或使用 WCF 服務的應用程式中檢查使用者的角色。例如,您可以從 Windows Forms 應用程式、Web 應用程式或未使用 .NET Framework 的應用程式中檢查使用者的角色。如需 Roles 應用程式服務的詳細資訊,請參閱 Windows Communication Foundation 角色服務概觀

角色管理 API

角色管理不受限於限制頁面或資料夾的權限。角色管理提供了 API,您可以使用這個 API,以程式設計方式來判斷使用者是否具備某角色。這可讓您撰寫程式碼來利用角色,並根據使用者所具備的角色 (而不只是根據使用者是誰) 來執行任何的應用程式工作。

如果您是在應用程式中建立使用者識別,便可以使用角色管理 API 方法來建立角色、將使用者加入至角色,並取得有哪些使用者具備哪些角色的相關資訊。這些方法可讓您建立自己的介面來管理角色。

如果您的應用程式會使用 Windows 驗證,則角色管理 API 可提供給角色管理的機能會比較少。例如,您無法使用角色管理來建立新的角色。您需改以使用 Windows 使用者和群組管理來建立使用者帳戶和群組,然後將使用者指派給群組。然後,角色管理便可讀取 Windows 使用者和群組資訊,讓您使用這些資訊進行驗證。

如果您使用 ASP.NET 角色服務,則可以檢查使用者是否屬於特定角色,或擷取使用者的所有角色。但是,您無法透過角色服務 API 來管理角色。

ASP.NET 角色管理如何運作

若要使用角色管理,首先您必須啟用它,並選擇性地設定可利用角色的存取規則。然後,您可在執行階段使用角色管理功能來使用角色。

角色管理設定

若要使用 ASP.NET 角色管理,請在應用程式的 Web.config 檔中使用如下的設定來啟用它:

<roleManager 
    enabled="true" 
    cacheRolesInCookie="true" >
</roleManager>

角色的典型使用情況是建立規則,來允許或拒絕對頁面或資料夾的存取。您可以在 Web.config 檔的 authorization 區段中設定這類存取規則。下列範例顯示如何允許成員角色中的使用者檢視 memberPages 資料夾中的頁面,但拒絕其他人存取:

<configuration>
  <location path="MemberPages">
    <system.web>
      <authorization>
        <allow roles="members" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>
  <!-- other configuration settings here -->
<configuration>

如需如何設定存取規則的詳細資訊,請參閱 ASP.NET 授權

您也必須建立如管理員或成員的角色,然後將使用者 ID 指派給這些角色。如果您的應用程式會使用 Windows 驗證,則可使用 Windows 電腦管理工具來建立使用者和群組。

如果您使用表單驗證,則可以使用 ASP.NET 網站管理工具來設定使用者和角色。如果您喜歡,您可以透過呼叫各種角色管理員方法,以程式設計方式來執行這項工作。下列程式碼顯示如何建立角色 members:

Roles.CreateRole("members")
Roles.CreateRole("members");

下列範例顯示如何將使用者 JoeWorden 單獨加入至角色 manager,以及如何將使用者 JillShrader 和 ShaiBassli 一次加入至角色 members:

Roles.AddUsersToRole("JoeWorden", "manager")
Dim userGroup(2) As String
userGroup(0) = "JillShrader"
userGroup(1) = "ShaiBassli"
Roles.AddUsersToRole(userGroup, "members")
Roles.AddUsersToRole("JoeWorden", "manager");
string[] userGroup = new string[2];
userGroup[0] = "JillShrader";
userGroup[1] = "ShaiBassli";
Roles.AddUsersToRole(userGroup, "members");
注意事項:

角色管理功能無法透過 ASP.NET 角色服務取得。角色服務只能傳回特定使用者的相關資訊。

在執行階段使用角色

在執行階段,當使用者造訪您的網站時,他們會以 Windows 帳戶名稱或登入應用程式的方式來建立識別 (在網際網路網站中,如果使用者造訪您的網站但未進行登入 (採匿名方式),則他們將不會有使用者識別,因此不會具備任何角色)。您的應用程式可以從 User 屬性取得已登入使用者的相關資訊。啟用角色時,ASP.NET 會查詢目前使用者的角色,並將這些角色加入至 User 物件供您檢查。下列範例顯示如何判斷目前使用者是否為成員的角色。如果使用者在這個角色中,程式碼會為成員顯示按鈕:

If User.IsInRole("members") Then
   buttonMembersArea.Visible = True
End If
if (User.IsInRole("members"))
{
   buttonMembersArea.Visible = True;
}

ASP.NET 也會建立 RolePrincipal 類別的執行個體,並將它加入至目前的要求內容。這可讓您利用程式設計的方式來執行角色管理工作,例如判斷有哪些使用者具備某一特定角色。下列範例顯示如何取得目前登入使用者的角色清單。

Dim userRoles() as String = CType(User, RolePrincipal).GetRoles()
string[] userRoles = ((RolePrincipal)User).GetRoles();

如果您正在應用程式中使用 LoginView 控制項,則控制項會檢查使用者的角色,並可根據使用者的角色動態建立使用者介面。

快取角色資訊

如果使用者的瀏覽器允許 Cookie,則 ASP.NET 可以選擇性地在使用者的電腦上,將角色資訊儲存在加密的 Cookie 中。每次收到頁面要求時,ASP.NET 都會讀取 Cookie,並從 Cookie 填入該使用者的角色資訊。這個策略可以減少從資料庫讀取角色資訊的需要。如果使用者的瀏覽器不支援 Cookie,或已停用 Cookie,則會改以只在每個頁面要求期間快取角色資訊。

請參閱

概念

角色管理提供者

角色管理類別

其他資源

保護 ASP.NET 網站