作法:使用 PrincipalPermissionAttribute 類別來限制存取

控制 Windows 網域電腦上資源的存取,是基本的安全性工作。 例如,只有特定使用者能夠檢視機密資料 (如薪資資料)。 本主題說明如何透過將使用者歸屬到預先定義的群組,以限制方法的存取。 如需工作範例,請參閱授權服務作業的存取權

這項工作包含兩個不同的程序。 第一個程序是建立群組並填入使用者。 第二個程序是套用 PrincipalPermissionAttribute 類別以指定群組。

建立 Windows 群組

  1. 開啟 [電腦管理] 主控台。

  2. 在左側面板中,按一下 [本機使用者和群組]

  3. 以滑鼠右鍵按一下 [群組],然後按一下 [新增群組]

  4. 在 [群組名稱] 方塊中輸入新群組的名稱。

  5. 在 [描述] 方塊中輸入新群組的描述。

  6. 按一下 [加入] 按鈕,將新成員加入至群組。

  7. 如果您將自己加入群組中,而且想要測試以下程式碼,則必須先登出電腦然後再登入,才能包含在該群組中。

要求使用者成員資格

  1. 開啟包含已實作服務合約代碼的 Windows Communication Foundation (WCF) 程式碼檔案。 如需實作合約的詳細資訊,請參閱實作服務合約

  2. 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 嵌入式管理單元檢視憑證。 若要尋找指紋值,請參閱如何:擷取憑證的指紋

使用憑證控制存取

  1. PrincipalPermissionAttribute 類別套用至您要限制存取的方法。

  2. 將屬性 (Attribute) 的動作設為 SecurityAction.Demand

  3. 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
    
  4. PrincipalPermissionMode 屬性設為 UseAspNetRoles,如以下組態範例所示:

    <behaviors>  
      <serviceBehaviors>  
      <behavior name="SvcBehavior1">  
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" />  
      </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    

    將這個值設為 UseAspNetRoles,表示 NamePrincipalPermissionAttribute 屬性將用來執行字串比較。 當憑證用來作為用戶端認證時,根據預設,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
    

另請參閱