Udostępnij za pośrednictwem


Instrukcje: Ograniczanie dostępu przy użyciu klasy PrincipalPermissionAttribute

Kontrolowanie dostępu do zasobów na komputerze domeny z systemem Windows jest podstawowym zadaniem zabezpieczeń. Na przykład tylko niektórzy użytkownicy powinni mieć możliwość wyświetlania poufnych danych, takich jak informacje o liście płac. W tym temacie wyjaśniono, jak ograniczyć dostęp do metody, żądając, aby użytkownik należał do wstępnie zdefiniowanej grupy. Aby zapoznać się z roboczym przykładem, zobacz Autoryzowanie dostępu do operacji usługi.

Zadanie składa się z dwóch oddzielnych procedur. Pierwszy tworzy grupę i wypełnia ją użytkownikami. Druga stosuje klasę PrincipalPermissionAttribute , aby określić grupę.

Aby utworzyć grupę systemu Windows

  1. Otwórz konsolę zarządzania komputerem.

  2. W panelu po lewej stronie kliknij pozycję Użytkownicy i grupy lokalne.

  3. Kliknij prawym przyciskiem myszy pozycję Grupy, a następnie kliknij pozycję Nowa grupa.

  4. W polu Nazwa grupy wpisz nazwę nowej grupy.

  5. W polu Opis wpisz opis nowej grupy.

  6. Kliknij przycisk Dodaj, aby dodać nowych członków do grupy.

  7. Jeśli dodano siebie do grupy i chcesz przetestować następujący kod, musisz wylogować się z komputera i zalogować się ponownie, aby zostać uwzględniony w grupie.

Aby zażądać członkostwa użytkowników

  1. Otwórz plik kodu programu Windows Communication Foundation (WCF), który zawiera zaimplementowany kod kontraktu usługi. Aby uzyskać więcej informacji na temat implementowania kontraktu, zobacz Implementowanie kontraktów usług.

  2. PrincipalPermissionAttribute Zastosuj atrybut do każdej metody, która musi być ograniczona do określonej grupy. Action Ustaw właściwość na Demand i Role właściwość na nazwę grupy. Na przykład:

    // 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
    
    

    Uwaga

    Jeśli zastosujesz atrybut do kontraktu PrincipalPermissionAttribute , SecurityException zostanie zgłoszony. Atrybut można zastosować tylko na poziomie metody.

Używanie certyfikatu do kontrolowania dostępu do metody

Możesz również użyć PrincipalPermissionAttribute klasy , aby kontrolować dostęp do metody, jeśli typ poświadczeń klienta jest certyfikatem. Aby to zrobić, musisz mieć podmiot certyfikatu i odcisk palca.

Aby sprawdzić certyfikat pod kątem jego właściwości, zobacz Instrukcje: wyświetlanie certyfikatów za pomocą przystawki MMC. Aby znaleźć wartość odcisku palca, zobacz Instrukcje: pobieranie odcisku palca certyfikatu.

Aby kontrolować dostęp przy użyciu certyfikatu

  1. Zastosuj klasę PrincipalPermissionAttribute do metody, do której chcesz ograniczyć dostęp.

  2. Ustaw akcję atrybutu na SecurityAction.Demand.

  3. Name Ustaw właściwość na ciąg składający się z nazwy podmiotu i odcisku palca certyfikatu. Rozdziel dwie wartości średnikami i spacją, jak pokazano w poniższym przykładzie:

    // 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 Ustaw właściwość na wartość UseAspNetRoles , jak pokazano w poniższym przykładzie konfiguracji:

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

    Ustawienie tej wartości na UseAspNetRoles wartość wskazuje, że Name właściwość PrincipalPermissionAttribute obiektu będzie używana do porównywania ciągów. Gdy certyfikat jest używany jako poświadczenie klienta, domyślnie program WCF łączy nazwę pospolitą certyfikatu i odcisk palca ze średnikiem, aby utworzyć unikatową wartość dla tożsamości podstawowej klienta. Po UseAspNetRoles ustawieniu wartości PrincipalPermissionMode w usłudze ta podstawowa wartość tożsamości jest porównywana z wartością Name właściwości w celu określenia praw dostępu użytkownika.

    Alternatywnie podczas tworzenia samoobsługowej usługi ustaw PrincipalPermissionMode właściwość w kodzie, jak pokazano w poniższym kodzie:

    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
    

Zobacz też