方法: PrincipalPermissionAttribute クラスでアクセスを制限する

Windows ドメイン コンピューターのリソースへのアクセスを制御することは、基本的なセキュリティ タスクです。 たとえば、給与情報のような機密データは、特定のユーザーだけが表示できるようにする必要があります。 ここでは、ユーザーが定義済みグループに属していることを要求することによって、メソッドへのアクセスを制限する方法について説明します。 作業用サンプルについては、「サービス操作へのアクセスの承認」を参照してください。

タスクは、2 つの別個の手順で構成されます。 最初の手順では、グループを作成してユーザーを追加します。 2 番目の手順では、グループを指定するために PrincipalPermissionAttribute クラスを適用します。

Windows グループを作成するには

  1. [コンピューターの管理] コンソールを開きます。

  2. 左のパネルで、 [ローカル ユーザーとグループ] をクリックします。

  3. [グループ] を右クリックし、 [新しいグループ] をクリックします。

  4. [グループ名] ボックスに、新しいグループの名前を入力します。

  5. [説明] ボックスに、新しいグループの説明を入力します。

  6. [追加] をクリックして、グループに新しいメンバーを追加します。

  7. 自分自身をグループに追加した場合は、次のコードをテストする前に、コンピューターからいったんログオフし、再度ログオンして自分自身をグループに含める必要があります。

ユーザー メンバーシップを要求するには

  1. 実装されたサービス コントラクト コードを含む Windows Communication Foundation (WCF) コード ファイルを開きます。 コントラクトの実装の詳細については、「サービス コントラクトの実装」を参照してください。

  2. 特定のグループに制限される必要がある各メソッドに PrincipalPermissionAttribute 属性を適用します。 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. 属性のアクションを SecurityAction.Demand に設定します。

  3. Name プロパティを、サブジェクト名と証明書の拇印で構成される文字列に設定します。 次の例に示すように、2 つの値をセミコロンと空白で区切ってください。

    // 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 によって証明書の共通名と拇印がセミコロンで連結されて、クライアントのプライマリ ID を表す一意の値が作成されます。 UseAspNetRoles をサービスの PrincipalPermissionMode として設定している場合、このプライマリ ID の値と 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
    

関連項目