Omówienie poziomów ochrony

Właściwość ProtectionLevel znajduje się w wielu różnych klasach, takich jak ServiceContractAttribute i OperationContractAttribute klasy. Właściwość steruje sposobem ochrony części (lub całości) komunikatu. W tym temacie opisano funkcję programu Windows Communication Foundation (WCF) i sposób jej działania.

Aby uzyskać instrukcje dotyczące ustawiania poziomu ochrony, zobacz Instrukcje: ustawianie właściwości ProtectionLevel.

Uwaga

Poziomy ochrony można ustawiać tylko w kodzie, a nie w konfiguracji.

Podstawy

Aby zrozumieć funkcję poziomu ochrony, mają zastosowanie następujące podstawowe instrukcje:

  • Istnieją trzy podstawowe poziomy ochrony dla każdej części komunikatu. Właściwość (wszędzie tam, gdzie występuje) jest ustawiona na jedną z ProtectionLevel wartości wyliczenia. W kolejności rosnącej ochrony obejmują:

    • None.

    • Sign. Część chroniona jest podpisana cyfrowo. Dzięki temu można wykryć wszelkie naruszenia chronionej części komunikatu.

    • EncryptAndSign. Część wiadomości jest szyfrowana w celu zapewnienia poufności przed jego podpisaniem.

  • Możesz ustawić wymagania dotyczące ochrony tylko dla danych aplikacji za pomocą tej funkcji. Na przykład nagłówki adresowania WS są danymi infrastruktury i dlatego nie mają wpływu na element ProtectionLevel.

  • Gdy tryb zabezpieczeń jest ustawiony na Transportwartość , cały komunikat jest chroniony przez mechanizm transportu. W związku z tym ustawienie oddzielnego poziomu ochrony dla różnych części komunikatu nie ma wpływu.

  • Jest ProtectionLevel to sposób, aby deweloper ustawił minimalny poziom , z którego musi być zgodne powiązanie. Po wdrożeniu usługi rzeczywiste powiązanie określone w konfiguracji może lub nie obsługuje minimalnego poziomu. Na przykład domyślnie BasicHttpBinding klasa nie dostarcza zabezpieczeń (chociaż można ją włączyć). W związku z tym użycie go z kontraktem, który ma jakiekolwiek ustawienie inne niż None spowoduje zgłoszenie wyjątku.

  • Jeśli usługa wymaga, aby minimalna ProtectionLevel wartość dla wszystkich komunikatów to Sign, klient (być może utworzony przez technologię inną niż WCF) może szyfrować i podpisywać wszystkie komunikaty (co jest więcej niż wymagane minimum). W takim przypadku program WCF nie zgłosi wyjątku, ponieważ klient wykonał więcej niż minimum. Należy jednak pamiętać, że aplikacje WCF (usługi lub klienci) nie będą zbyt bezpieczne części komunikatu, jeśli to możliwe, ale będą zgodne z minimalnym poziomem. Należy również pamiętać, że w przypadku korzystania z Transport trybu zabezpieczeń transport może nadmiernie zabezpieczyć strumień komunikatów, ponieważ z założenia nie jest w stanie zabezpieczyć się na bardziej szczegółowym poziomie.

  • Jeśli ustawisz ProtectionLevel jawnie Sign wartość lub EncryptAndSign, musisz użyć powiązania z włączonymi zabezpieczeniami lub zostanie zgłoszony wyjątek.

  • Jeśli wybierzesz powiązanie, które włącza zabezpieczenia i nie ustawisz ProtectionLevel właściwości w dowolnym miejscu umowy, wszystkie dane aplikacji zostaną zaszyfrowane i podpisane.

  • Jeśli wybierzesz powiązanie, które nie ma włączonego zabezpieczeń (na przykład BasicHttpBinding klasa ma domyślnie wyłączone zabezpieczenia) i ProtectionLevel nie zostanie jawnie ustawiona, żadne dane aplikacji nie będą chronione.

  • Jeśli używasz powiązania, które stosuje zabezpieczenia na poziomie transportu, wszystkie dane aplikacji będą zabezpieczone zgodnie z możliwościami transportu.

  • Jeśli używasz powiązania, które stosuje zabezpieczenia na poziomie komunikatu, dane aplikacji będą zabezpieczone zgodnie z poziomami ochrony ustawionymi w umowie. Jeśli nie określisz poziomu ochrony, wszystkie dane aplikacji w komunikatach zostaną zaszyfrowane i podpisane.

  • Można je ustawić na różnych poziomach określania ProtectionLevel zakresu. Istnieje hierarchia skojarzona z określaniem zakresu, co zostało wyjaśnione w następnej sekcji.

Określanie zakresu

Ustawienie elementu ProtectionLevel na najwyższym poziomie interfejsu API ustawia poziom dla wszystkich poziomów poniżej. ProtectionLevel Jeśli parametr jest ustawiony na inną wartość na niższym poziomie, wszystkie interfejsy API poniżej tego poziomu w hierarchii zostaną zresetowane do nowego poziomu (interfejsy API powyżej niego, jednak nadal będą miały wpływ na najwyższy poziom). Hierarchia jest następująca. Atrybuty na tym samym poziomie są elementami równorzędnymi.

Ochrona przed programowaniemLevel

Aby programować ProtectionLevel obiekt w dowolnym momencie w hierarchii, po prostu ustaw właściwość na odpowiednią wartość podczas stosowania atrybutu. Przykłady można znaleźć w temacie How to: Set the ProtectionLevel Property (Instrukcje: ustawianie właściwości ProtectionLevel).

Uwaga

Ustawienie właściwości na błędach i kontraktach komunikatów wymaga zrozumienia sposobu działania tych funkcji. Aby uzyskać więcej informacji, zobacz How to: Set the ProtectionLevel Property and Using Message Contracts (Instrukcje: ustawianie właściwości ProtectionLevel i używanie kontraktów komunikatów).

Zależność adresowania WS

W większości przypadków użycie narzędzia ServiceModel Metadata Tool (Svcutil.exe) w celu wygenerowania klienta gwarantuje, że kontrakty klienta i usługi są identyczne. Jednak pozornie identyczne kontrakty mogą spowodować, że klient zgłosi wyjątek. Dzieje się tak za każdym razem, gdy powiązanie nie obsługuje specyfikacji adresowania WS, a w umowie określono wiele poziomów ochrony. Na przykład BasicHttpBinding klasa nie obsługuje specyfikacji lub jeśli tworzysz powiązanie niestandardowe, które nie obsługuje adresowania WS. Funkcja ProtectionLevel opiera się na specyfikacji adresowania WS, aby umożliwić różne poziomy ochrony na jednym kontrakcie. Jeśli powiązanie nie obsługuje specyfikacji adresowania WS, wszystkie poziomy zostaną ustawione na ten sam poziom ochrony. Obowiązujący poziom ochrony dla wszystkich zakresów umowy zostanie ustawiony na najsilniejszy poziom ochrony używany w umowie.

Może to spowodować problem, który jest trudny do debugowania na pierwszy rzut oka. Istnieje możliwość utworzenia kontraktu klienta (interfejsu), który zawiera metody dla więcej niż jednej usługi. Oznacza to, że ten sam interfejs służy do tworzenia klienta, który komunikuje się z wieloma usługami, a pojedynczy interfejs zawiera metody dla wszystkich usług. Deweloper musi zachować ostrożność w tym rzadkim scenariuszu, aby wywołać tylko te metody, które mają zastosowanie do każdej konkretnej usługi. Jeśli powiązanie jest klasą BasicHttpBinding , nie można obsługiwać wielu poziomów ochrony. Jednak usługa odpowiadająca klientowi może reagować na klienta z niższym poziomem ochrony niż wymagany. W takim przypadku klient zgłosi wyjątek, ponieważ oczekuje wyższego poziomu ochrony.

Przykład kodu ilustruje ten problem. W poniższym przykładzie przedstawiono usługę i kontrakt klienta. Załóżmy, że powiązanie jest elementem <basicHttpBinding> . W związku z tym wszystkie operacje na kontrakcie mają ten sam poziom ochrony. Ten jednolity poziom ochrony jest określany jako maksymalny poziom ochrony we wszystkich operacjach.

Kontrakt usługi to:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Poniższy kod przedstawia interfejs kontraktu klienta. Należy pamiętać, że zawiera ona metodę Tax , która ma być używana z inną usługą:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract()]
    int Tax();

    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract()> _
    Function Tax() As Integer

    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Gdy klient wywołuje metodę Price , zgłasza wyjątek, gdy otrzyma odpowiedź z usługi. Dzieje się tak, ponieważ klient nie określa ProtectionLevel elementu w ServiceContractAttributeobiekcie , a w związku z tym klient używa wartości domyślnej (EncryptAndSign) dla wszystkich metod, w tym Price metody . Jednak usługa zwraca wartość przy użyciu Sign poziomu, ponieważ kontrakt usługi definiuje jedną metodę, która ma jej poziom ochrony ustawiony na Signwartość . W takim przypadku klient zgłosi błąd podczas sprawdzania poprawności odpowiedzi z usługi.

Zobacz też