作法:使用 PrincipalPermissionAttribute 類別來限制存取
控制 Windows 網域電腦上資源的存取,是基本的安全性工作。 例如,只有特定使用者能夠檢視機密資料 (如薪資資料)。 本主題說明如何透過將使用者歸屬到預先定義的群組,以限制方法的存取。 如需工作範例,請參閱授權服務作業的存取權。
這項工作包含兩個不同的程序。 第一個程序是建立群組並填入使用者。 第二個程序是套用 PrincipalPermissionAttribute 類別以指定群組。
建立 Windows 群組
開啟 [電腦管理] 主控台。
在左側面板中,按一下 [本機使用者和群組]。
以滑鼠右鍵按一下 [群組],然後按一下 [新增群組]。
在 [群組名稱] 方塊中輸入新群組的名稱。
在 [描述] 方塊中輸入新群組的描述。
按一下 [加入] 按鈕,將新成員加入至群組。
如果您將自己加入群組中,而且想要測試以下程式碼,則必須先登出電腦然後再登入,才能包含在該群組中。
要求使用者成員資格
開啟包含已實作服務合約代碼的 Windows Communication Foundation (WCF) 程式碼檔案。 如需實作合約的詳細資訊,請參閱實作服務合約。
將 PrincipalPermissionAttribute 屬性 (Attribute) 套用至每一個必須限於特定群組的方法。 將 Action 屬性設為 Demand,並將 Role 屬性設為群組名稱。 例如:
// Only members of the CalculatorClients group can call this method. [PrincipalPermission(SecurityAction.Demand, Role = "CalculatorClients")] public double Add(double a, double b) { return a + b; }
' Only members of the CalculatorClients group can call this method. <PrincipalPermission(SecurityAction.Demand, Role:="CalculatorClients")> _ Public Function Add(ByVal a As Double, ByVal b As Double) As Double Return a + b End Function
注意
如果您將 PrincipalPermissionAttribute 屬性套用至合約,則會擲回 SecurityException。 您只能在方法層級套用此屬性。
使用憑證控制方法的存取
如果用戶端認證類型為憑證,您也可以使用 PrincipalPermissionAttribute
類別控制方法的存取。 若要執行這項操作,您必須擁有憑證的主體和指紋。
若要檢查憑證的屬性,請參閱如何:使用 MMC 嵌入式管理單元檢視憑證。 若要尋找指紋值,請參閱如何:擷取憑證的指紋。
使用憑證控制存取
將 PrincipalPermissionAttribute 類別套用至您要限制存取的方法。
將屬性 (Attribute) 的動作設為 SecurityAction.Demand。
將
Name
屬性設為字串,包含主體名稱和憑證的指紋。 使用分號和空格分隔這兩個值,如以下範例所示:// Only a client authenticated with a valid certificate that has the // specified subject name and thumbprint can call this method. [PrincipalPermission(SecurityAction.Demand, Name = "CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")] public double Multiply(double a, double b) { return a * b; }
' Only a client authenticated with a valid certificate that has the ' specified subject name and thumbprint can call this method. <PrincipalPermission(SecurityAction.Demand, Name:="CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")> _ Public Function Multiply(ByVal a As Double, ByVal b As Double) As Double Return a * b End Function
將 PrincipalPermissionMode 屬性設為 UseAspNetRoles,如以下組態範例所示:
<behaviors> <serviceBehaviors> <behavior name="SvcBehavior1"> <serviceAuthorization principalPermissionMode="UseAspNetRoles" /> </behavior> </serviceBehaviors> </behaviors>
將這個值設為
UseAspNetRoles
,表示Name
的PrincipalPermissionAttribute
屬性將用來執行字串比較。 當憑證用來作為用戶端認證時,根據預設,WCF 會使用分號串連憑證一般名稱和指紋,以便為用戶端的主要身分識別建立唯一的值。 將服務上的UseAspNetRoles
設為PrincipalPermissionMode
之後,這個主要身分識別值會與Name
屬性值比較,以判斷使用者的存取權限。或者,當建立自我裝載服務時,依照以下程式碼所示,設定程式碼中的 PrincipalPermissionMode 屬性:
ServiceHost myServiceHost = new ServiceHost(typeof(Calculator), baseUri); ServiceAuthorizationBehavior myServiceBehavior = myServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>(); myServiceBehavior.PrincipalPermissionMode = PrincipalPermissionMode.UseAspNetRoles;
Dim myServiceBehavior As ServiceAuthorizationBehavior myServiceBehavior = _ myServiceHost.Description.Behaviors.Find(Of ServiceAuthorizationBehavior)() myServiceBehavior.PrincipalPermissionMode = _ PrincipalPermissionMode.UseAspNetRoles