Zabezpieczanie klientów [WCF]

W programie Windows Communication Foundation (WCF) usługa określa wymagania dotyczące zabezpieczeń klientów. Oznacza to, że usługa określa, jaki tryb zabezpieczeń ma być używany i czy klient musi podać poświadczenia. W związku z tym proces zabezpieczania klienta jest prosty: użyj metadanych uzyskanych z usługi (jeśli został opublikowany) i skompiluj klienta. Metadane określają sposób konfigurowania klienta. Jeśli usługa wymaga podania poświadczeń przez klienta, należy uzyskać poświadczenia spełniające wymagania. W tym temacie omówiono szczegółowo proces. Aby uzyskać więcej informacji na temat tworzenia bezpiecznej usługi, zobacz Zabezpieczanie usług.

Usługa określa zabezpieczenia

Domyślnie powiązania programu WCF mają włączone funkcje zabezpieczeń. (Wyjątek to BasicHttpBinding.) W związku z tym, jeśli usługa została utworzona przy użyciu usługi WCF, istnieje większe prawdopodobieństwo, że wdroży zabezpieczenia w celu zapewnienia uwierzytelniania, poufności i integralności. W takim przypadku metadane zapewniane przez usługę będą wskazywać, czego wymaga ustanowienia bezpiecznego kanału komunikacyjnego. Jeśli metadane usługi nie zawierają żadnych wymagań dotyczących zabezpieczeń, nie ma możliwości nałożenia schematu zabezpieczeń, takiego jak Secure Sockets Layer (SSL) za pośrednictwem protokołu HTTP, w usłudze. Jeśli jednak usługa wymaga od klienta podania poświadczeń, deweloper klienta, wdrożenie lub administrator musi podać rzeczywiste poświadczenia, które klient będzie używał do uwierzytelnienia się w usłudze.

Uzyskiwanie metadanych

Podczas tworzenia klienta pierwszym krokiem jest uzyskanie metadanych usługi, z którą klient będzie się komunikować. Można to zrobić na dwa sposoby. Po pierwsze, jeśli usługa publikuje punkt końcowy wymiany metadanych (MEX) lub udostępnia metadane za pośrednictwem protokołu HTTP lub HTTPS, możesz pobrać metadane przy użyciu narzędzia ServiceModel Metadata Tool (Svcutil.exe),który generuje oba pliki kodu dla klienta, a także plik konfiguracji. (Aby uzyskać więcej informacji na temat korzystania z narzędzia, zobacz Uzyskiwanie dostępu do usług przy użyciu klienta WCF). Jeśli usługa nie publikuje punktu końcowego MEX, a także nie udostępnia metadanych za pośrednictwem protokołu HTTP lub HTTPS, musisz skontaktować się z twórcą usługi, aby uzyskać dokumentację opisjącą wymagania dotyczące zabezpieczeń i metadane.

Ważne

Zaleca się, aby metadane pochodziły z zaufanego źródła i że nie zostały naruszone. Metadane pobierane przy użyciu protokołu HTTP są wysyłane w postaci zwykłego tekstu i mogą zostać naruszone. Jeśli usługa używa HttpsGetEnabled właściwości i HttpsGetUrl , użyj adresu URL podanego przez twórcę usługi, aby pobrać dane przy użyciu protokołu HTTPS.

Weryfikowanie zabezpieczeń

Źródła metadanych można podzielić na dwie szerokie kategorie: źródła zaufania i niezaufane źródła. Jeśli ufasz źródle i pobrano kod klienta i inne metadane z bezpiecznego punktu końcowego MEX tego źródła, możesz skompilować klienta, podać go przy użyciu odpowiednich poświadczeń i uruchomić go bez innych problemów.

Jeśli jednak zdecydujesz się pobrać klienta i metadane ze źródła, o którym niewiele wiesz, pamiętaj o zweryfikowaniu środków zabezpieczeń używanych przez kod. Na przykład nie można po prostu utworzyć klienta, który wysyła dane osobowe lub finansowe do usługi, chyba że usługa wymaga poufności i integralności (przynajmniej). Użytkownik powinien ufać właścicielowi usługi w zakresie, w jakim chcesz ujawnić takie informacje, ponieważ takie informacje będą widoczne dla nich.

W związku z tym w przypadku używania kodu i metadanych z niezaufanego źródła sprawdź kod i metadane, aby upewnić się, że spełnia wymagany poziom zabezpieczeń.

Ustawianie poświadczeń klienta

Ustawienie poświadczeń klienta na kliencie składa się z dwóch kroków:

  1. Określ typ poświadczeń klienta wymagany przez usługę. Jest to realizowane przez jedną z dwóch metod. Najpierw, jeśli masz dokumentację od twórcy usługi, powinien określić typ poświadczeń klienta (jeśli istnieje) wymagane przez usługę. Po drugie, jeśli masz tylko plik konfiguracji wygenerowany przez narzędzie Svcutil.exe, możesz sprawdzić poszczególne powiązania, aby określić wymagany typ poświadczeń.

  2. Określ rzeczywiste poświadczenia klienta. Rzeczywiste poświadczenie klienta jest nazywane wartością poświadczeń klienta, aby odróżnić je od typu. Jeśli na przykład typ poświadczeń klienta określa certyfikat, należy podać certyfikat X.509 wystawiony przez urząd certyfikacji, któremu ufa usługa.

Określanie typu poświadczeń klienta

Jeśli masz plik konfiguracji wygenerowanego narzędzia Svcutil.exe, sprawdź <sekcję powiązań> , aby określić wymagany typ poświadczeń klienta. W sekcji znajdują się elementy powiązania, które określają wymagania dotyczące zabezpieczeń. W szczególności sprawdź <element zabezpieczeń> każdego powiązania. Ten element zawiera mode atrybut , który można ustawić na jedną z trzech możliwych wartości (Message, Transport, lub TransportWithMessageCredential). Wartość atrybutu określa tryb, a tryb określa, które elementy podrzędne są istotne.

Element <security> może zawierać element <transport> lub <message> albo oba. Istotnym elementem jest ten, który jest zgodny z trybem zabezpieczeń. Na przykład poniższy kod określa, że tryb zabezpieczeń to "Message", a typ poświadczeń klienta dla <message> elementu to "Certificate". W takim przypadku <transport> element można zignorować. Jednak element określa, <message> że należy podać certyfikat X.509.

<wsHttpBinding>  
    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"
                      realm="" />  
           <message clientCredentialType="Certificate"
                    negotiateServiceCredential="true"  
                    algorithmSuite="Default"
                    establishSecurityContext="true" />  
       </security>  
    </binding>  
</wsHttpBinding>  

Należy pamiętać, że jeśli clientCredentialType atrybut jest ustawiony na "Windows"wartość , jak pokazano w poniższym przykładzie, nie trzeba podawać rzeczywistej wartości poświadczeń. Wynika to z faktu, że zintegrowane zabezpieczenia systemu Windows zapewniają rzeczywiste poświadczenia (token Kerberos) osoby, która uruchamia klienta.

<security mode="Message">  
    <transport clientCredentialType="Windows "
        realm="" />  
</security>  

Ustawianie wartości poświadczeń klienta

Jeśli ustali się, że klient musi podać poświadczenia, użyj odpowiedniej metody, aby skonfigurować klienta. Aby na przykład ustawić certyfikat klienta, użyj SetCertificate metody .

Typową formą poświadczeń jest certyfikat X.509. Poświadczenie można podać na dwa sposoby:

  • Programując go w kodzie klienta (przy użyciu SetCertificate metody ).

Dodając sekcję <zachowania> pliku konfiguracji dla klienta i używając clientCredentials elementu (pokazanego poniżej).

<Ustawianie wartości clientCredentials> w kodzie

Aby ustawić <wartość clientCredentials> w kodzie, musisz uzyskać dostęp do ClientCredentials właściwości ClientBase<TChannel> klasy. Właściwość zwraca ClientCredentials obiekt, który umożliwia dostęp do różnych typów poświadczeń, jak pokazano w poniższej tabeli.

Właściwość ClientCredential opis Uwagi
ClientCertificate Zwraca wartość X509CertificateInitiatorClientCredential Reprezentuje certyfikat X.509 dostarczony przez klienta w celu uwierzytelnienia się w usłudze.
HttpDigest Zwraca wartość HttpDigestClientCredential Reprezentuje poświadczenie szyfrowane HTTP. Poświadczenie to skrót nazwy użytkownika i hasła.
IssuedToken Zwraca wartość IssuedTokenClientCredential Reprezentuje niestandardowy token zabezpieczający wystawiony przez usługę tokenu zabezpieczającego, często używany w scenariuszach federacji.
Peer Zwraca wartość PeerCredential Reprezentuje poświadczenie elementu równorzędnego do udziału w siatce równorzędnej w domenie systemu Windows.
ServiceCertificate Zwraca wartość X509CertificateRecipientClientCredential Reprezentuje certyfikat X.509 dostarczony przez usługę w negocjacjach poza pasmem.
UserName Zwraca wartość UserNamePasswordClientCredential Reprezentuje nazwę użytkownika i parę haseł.
Windows Zwraca wartość WindowsClientCredential Reprezentuje poświadczenia klienta systemu Windows (poświadczenie Protokołu Kerberos). Właściwości klasy są tylko do odczytu.

<Ustawianie wartości clientCredentials> w konfiguracji

Wartości poświadczeń są określane przy użyciu zachowania punktu końcowego jako elementów podrzędnych <elementu clientCredentials> . Użyty element zależy od typu poświadczeń klienta. Na przykład w poniższym przykładzie pokazano konfigurację ustawiania certyfikatu X.509 przy użyciu <<elementu clientCertificate>.

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">  
          <clientCredentials>  
            <clientCertificate findvalue="myMachineName"
            storeLocation="Current" X509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>  
</configuration>  

Aby ustawić poświadczenia klienta w konfiguracji, dodaj <element endpointBehaviors> do pliku konfiguracji. Ponadto dodany element zachowania musi być połączony z punktem końcowym usługi przy użyciu behaviorConfiguration atrybutu <punktu końcowego><elementu klienta> , jak pokazano w poniższym przykładzie. Wartość atrybutu behaviorConfiguration musi być zgodna z wartością atrybutu zachowania name .

<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost/servicemodelsamples/service.svc"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                behaviorConfiguration="myEndpointBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

Uwaga

Niektórych wartości poświadczeń klienta nie można ustawić przy użyciu plików konfiguracji aplikacji, na przykład nazwy użytkownika i hasła albo wartości użytkownika i hasła systemu Windows. Takie wartości poświadczeń można określić tylko w kodzie.

Aby uzyskać więcej informacji na temat ustawiania poświadczeń klienta, zobacz Instrukcje: Określanie wartości poświadczeń klienta.

Uwaga

ClientCredentialType parametr jest ignorowany, gdy SecurityMode jest ustawiona na "TransportWithMessageCredential", wartość , jak pokazano w poniższej przykładowej konfiguracji.

<wsHttpBinding>  
    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"
               establishSecurityContext="false"
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  
         </security>  
    </binding>  
</wsHttpBinding>  

Zobacz też