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
Otwórz konsolę zarządzania komputerem.
W panelu po lewej stronie kliknij pozycję Użytkownicy i grupy lokalne.
Kliknij prawym przyciskiem myszy pozycję Grupy, a następnie kliknij pozycję Nowa grupa.
W polu Nazwa grupy wpisz nazwę nowej grupy.
W polu Opis wpisz opis nowej grupy.
Kliknij przycisk Dodaj, aby dodać nowych członków do grupy.
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
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.
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
Zastosuj klasę PrincipalPermissionAttribute do metody, do której chcesz ograniczyć dostęp.
Ustaw akcję atrybutu na SecurityAction.Demand.
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
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, żeName
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. PoUseAspNetRoles
ustawieniu wartościPrincipalPermissionMode
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