Udostępnij za pośrednictwem


Zachowania zabezpieczeń w programie WCF

W programie Windows Communication Foundation (WCF) zachowania modyfikują zachowanie czasu wykonywania na poziomie usługi lub na poziomie punktu końcowego. (Aby uzyskać więcej informacji na temat ogólnych zachowań, zobacz Określanie zachowania czasu wykonywania usługi). Zachowania zabezpieczeń umożliwiają kontrolę nad poświadczeniami, uwierzytelnianiem, autoryzacją i dziennikami inspekcji. Zachowania można używać za pomocą programowania lub konfiguracji.

Ten artykuł koncentruje się na konfigurowaniu następujących zachowań związanych z funkcjami zabezpieczeń:

Ustawianie poświadczeń przy użyciu zachowań

Użyj parametrów serviceCredentials i< clientCredentials>>, aby ustawić wartości poświadczeń dla usługi lub klienta.< Podstawowa konfiguracja powiązania określa, czy należy ustawić poświadczenia. Jeśli na przykład tryb zabezpieczeń jest ustawiony na None, zarówno klienci, jak i usługi nie uwierzytelniają się nawzajem i nie wymagają poświadczeń dowolnego typu.

Z drugiej strony powiązanie usługi może wymagać typu poświadczeń klienta. W takim przypadku może być konieczne ustawienie wartości poświadczeń przy użyciu zachowania. (Aby uzyskać więcej informacji na temat możliwych typów poświadczeń, zobacz Wybieranie typu poświadczeń). W niektórych przypadkach, takich jak gdy poświadczenia systemu Windows są używane do uwierzytelniania, środowisko automatycznie ustanawia rzeczywistą wartość poświadczeń i nie trzeba jawnie ustawiać wartości poświadczeń (chyba że chcesz określić inny zestaw poświadczeń).

Wszystkie poświadczenia usługi są znajdowane jako elementy podrzędne usługiBehaviors>.< W poniższym przykładzie pokazano certyfikat używany jako poświadczenia usługi.

<configuration>
 <system.serviceModel>
  <behaviors>
   <serviceBehaviors>
    <behavior name="ServiceBehavior1">
     <serviceCredentials>
      <serviceCertificate findValue="000000000000000000000000000"
                          storeLocation="CurrentUser"
      storeName="Root" x509FindType="FindByThumbprint" />
     </serviceCredentials>
    </behavior>
   </serviceBehaviors>
  </behaviors>
 </system.serviceModel>
</configuration>

Poświadczenia usługi

Element serviceCredentials zawiera cztery elementy podrzędne>.< Elementy i ich użycie zostały omówione w poniższych sekcjach.

<serviceCertificate> , element

Użyj tego elementu, aby określić certyfikat X.509 używany do uwierzytelniania usługi na klientach przy użyciu trybu zabezpieczeń komunikatów. Jeśli używasz certyfikatu, który jest okresowo odnawiany, jego odcisk palca ulega zmianie. W takim przypadku należy użyć nazwy podmiotu jako X509FindType elementu , ponieważ certyfikat może zostać ponownie wyświetlony przy użyciu tej samej nazwy podmiotu.

Aby uzyskać więcej informacji na temat używania elementu, zobacz How to: Specify Client Credential Values (Instrukcje: określanie wartości poświadczeń klienta).

<<certyfikat> clientCertificate>, element

Użyj elementu certyfikatu<>, gdy usługa musi mieć certyfikat klienta z wyprzedzeniem, aby bezpiecznie komunikować się z klientem. Dzieje się tak w przypadku korzystania ze wzorca komunikacji dwukierunkowej. W bardziej typowym wzorcu odpowiedzi na żądanie klient zawiera jego certyfikat, którego usługa używa do zabezpieczania odpowiedzi z powrotem do klienta. Wzorzec komunikacji dwustronnej nie ma jednak żadnych żądań i odpowiedzi. Usługa nie może wywnioskować certyfikatu klienta z komunikacji i dlatego usługa wymaga certyfikatu klienta z wyprzedzeniem, aby zabezpieczyć komunikaty do klienta. Certyfikat klienta należy uzyskać w sposób poza pasmem i określić certyfikat przy użyciu tego elementu. Aby uzyskać więcej informacji na temat usług dwukierunkowych, zobacz How to: Create a Duplex Contract (Instrukcje: tworzenie kontraktu dwustronnego).

<<uwierzytelnianie> elementu clientCertificate>

Element <uwierzytelniania umożliwia dostosowanie sposobu uwierzytelniania> klientów. Atrybut można ustawić CertificateValidationMode na None, , ChainTrustPeerOrChainTrust, PeerTrust, lub Custom. Domyślnie poziom jest ustawiony na ChainTrust, który określa, że każdy certyfikat musi znajdować się w hierarchii certyfikatów kończących się urzędem głównym w górnej części łańcucha. Jest to najbardziej bezpieczny tryb. Można również ustawić wartość na PeerOrChainTrust, która określa, że certyfikaty wystawione samodzielnie (zaufanie równorzędne) są akceptowane, a także certyfikaty, które znajdują się w zaufanym łańcuchu. Ta wartość jest używana podczas opracowywania i debugowania klientów i usług, ponieważ certyfikaty wystawione samodzielnie nie muszą być kupowane z zaufanego urzędu. Podczas wdrażania klienta użyj ChainTrust wartości . Możesz również ustawić wartość na Custom. W przypadku ustawienia wartości należy również ustawić Custom CustomCertificateValidatorType atrybut na zestaw i typ używany do weryfikacji certyfikatu. Aby utworzyć własny niestandardowy moduł sprawdzania poprawności, należy dziedziczyć z klasy abstrakcyjnej X509CertificateValidator .

<issuedTokenAuthentication> , element

Wystawiony scenariusz tokenu ma trzy etapy. W pierwszym etapie klient próbujący uzyskać dostęp do usługi jest określany jako usługa bezpiecznego tokenu (STS). Usługa STS następnie uwierzytelnia klienta, a następnie wystawia klientowi token, zazwyczaj token języka SAML (Security Assertions Markup Language). Następnie klient wraca do usługi przy użyciu tokenu. Usługa sprawdza token dla danych, które umożliwiają usłudze uwierzytelnianie tokenu i w związku z tym klienta. Aby uwierzytelnić token, certyfikat używany przez usługę bezpiecznego tokenu musi być znany usłudze. Wystawiony <element issuedTokenAuthentication> to repozytorium dla jakichkolwiek certyfikatów usługi bezpiecznego tokenu. Aby dodać certyfikaty, użyj <znanychcertyfikatów>. <Wstaw dodatek> dla każdego certyfikatu, jak pokazano w poniższym przykładzie.

<issuedTokenAuthentication>
   <knownCertificates>
      <add findValue="www.contoso.com"
           storeLocation="LocalMachine" storeName="My"
           X509FindType="FindBySubjectName" />
    </knownCertificates>
</issuedTokenAuthentication>

Domyślnie certyfikaty muszą być uzyskiwane z usługi bezpiecznego tokenu. Te "znane" certyfikaty zapewniają, że tylko wiarygodni klienci mogą uzyskiwać dostęp do usługi.

Należy użyć <kolekcji allowedAudienceUris> w aplikacji federacyjnej, która korzysta z usługi bezpiecznego tokenu (STS), która wystawia SamlSecurityToken tokeny zabezpieczające. Gdy usługa STS wystawia token zabezpieczający, może określić identyfikator URI usług sieci Web, dla których jest przeznaczony token zabezpieczający, dodając element SamlAudienceRestrictionCondition do tokenu zabezpieczającego. SamlSecurityTokenAuthenticator Umożliwia to usłudze sieci Web odbiorcy sprawdzenie, czy wystawiony token zabezpieczający jest przeznaczony dla tej usługi sieci Web, określając, że ta kontrola powinna zostać wykonana, wykonując następujące czynności:

Aby uzyskać więcej informacji, zobacz SamlSecurityTokenAuthenticator.

Aby uzyskać więcej informacji na temat korzystania z tego elementu konfiguracji, zobacz How to: Configure Credentials on a Federation Service (Jak skonfigurować poświadczenia w usłudze federacyjnej).

Zezwalaj na anonimowych użytkowników usługi CardSpace

AllowUntrustedRsaIssuers Ustawienie atrybutu <IssuedTokenAuthentication> elementu w celu true jawnego zezwalania każdemu klientowi na prezentowanie tokenu wystawionego samodzielnie z dowolną parą kluczy RSA. Wystawca jest niezaufany , ponieważ klucz nie ma skojarzonych z nim danych wystawcy. Użytkownik Usługi CardSpace może utworzyć kartę wystawioną samodzielnie, która zawiera oświadczenia tożsamości udostępniane przez siebie. Użyj tej funkcji z ostrożnością. Aby użyć tej funkcji, należy traktować klucz publiczny RSA jako bezpieczniejsze hasło, które powinno być przechowywane w bazie danych wraz z nazwą użytkownika. Przed zezwoleniem klientowi na dostęp do usługi zweryfikuj klucz publiczny RSA przedstawiony przez klienta, porównując go z przechowywanym kluczem publicznym dla przedstawionej nazwy użytkownika. Zakłada się, że ustanowiono proces rejestracji, w którym użytkownicy mogą rejestrować swoje nazwy użytkowników i kojarzyć je z własnymi kluczami publicznymi RSA.

Poświadczenia klienta

Poświadczenia klienta są używane do uwierzytelniania klienta w usługach w przypadkach, gdy wymagane jest wzajemne uwierzytelnianie. W sekcji można określić certyfikaty usługi dla scenariuszy, w których klient musi zabezpieczyć komunikaty w usłudze przy użyciu certyfikatu usługi.

Możesz również skonfigurować klienta w ramach scenariusza federacji, aby używać wystawionych tokenów z usługi bezpiecznego tokenu lub lokalnego wystawcy tokenów. Aby uzyskać więcej informacji na temat scenariuszy federacyjnych, zobacz Federacja i Wystawione tokeny. Wszystkie poświadczenia klienta znajdują się w obszarze <endpointBehaviors>, jak pokazano w poniższym kodzie.

<behaviors>
 <endpointBehaviors>
  <behavior name="EndpointBehavior1">
   <clientCredentials>
    <clientCertificate findValue="cn=www.contoso.com"
        storeLocation="LocalMachine"
        storeName="AuthRoot" x509FindType="FindBySubjectName" />
    <serviceCertificate>
     <defaultCertificate findValue="www.cohowinery.com"
                    storeLocation="LocalMachine"
                    storeName="Root" x509FindType="FindByIssuerName" />
    <authentication revocationMode="Online"
                    trustedStoreLocation="LocalMachine" />
    </serviceCertificate>
   </clientCredentials>
  </behavior>
 </endpointBehaviors>
</behaviors>

<clientCertificate> , element

Ustaw certyfikat używany do uwierzytelniania klienta za pomocą tego elementu. Aby uzyskać więcej informacji, zobacz How to: Specify Client Credential Values (Instrukcje: określanie wartości poświadczeń klienta).

<httpDigest>

Ta funkcja musi być włączona w usłudze Active Directory w systemach Windows i Internet Information Services (IIS). Aby uzyskać więcej informacji, zobacz Uwierzytelnianie szyfrowane w usługach IIS 6.0.

<issuedToken> , element

Wystawiony Token <> zawiera elementy używane do konfigurowania lokalnego wystawcy tokenów lub zachowań używanych z usługą tokenu zabezpieczającego. Aby uzyskać instrukcje dotyczące konfigurowania klienta do używania wystawcy lokalnego, zobacz Instrukcje: Konfigurowanie wystawcy lokalnego.

<localIssuerAddress>

Określa domyślny adres usługi tokenu zabezpieczającego. Jest to używane, gdy WSFederationHttpBinding adres URL usługi tokenu zabezpieczającego nie jest podany lub gdy adres wystawcy powiązania federacyjnego to http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous lub null. W takich przypadkach należy skonfigurować parametr ClientCredentials z adresem lokalnego wystawcy i powiązaniem, które ma być używane do komunikowania się z tym wystawcą.

<issuerChannelBehaviors>

Użyj wystawcyChannelBehaviors><, aby dodać zachowania klienta WCF używane podczas komunikacji z usługą tokenu zabezpieczającego. Zdefiniuj <zachowania klienta w sekcji endpointBehaviors> . Aby użyć zdefiniowanego zachowania, dodaj <add> element do <issuerChannelBehaviors> elementu z dwoma atrybutami. issuerAddress Ustaw wartość na adres URL usługi tokenu zabezpieczającego i ustaw behaviorConfiguration atrybut na nazwę zdefiniowanego zachowania punktu końcowego, jak pokazano w poniższym przykładzie.

<clientCredentials>
   <issuedToken>
      <issuerChannelBehaviors>
         <add issuerAddress="http://www.contoso.com"
               behaviorConfiguration="clientBehavior1" />
      </issuerChannelBehaviors>
   </issuedToken>
</clientCredentials>

<serviceCertificate> , element

Ten element służy do kontrolowania uwierzytelniania certyfikatów usługi.

Element <defaultCertificate> może przechowywać pojedynczy certyfikat używany, gdy usługa nie określa certyfikatu.

Użyj elementu <scopedCertificates> i <dodaj polecenie> , aby ustawić certyfikaty usług skojarzone z określonymi usługami. Element <add> zawiera targetUri atrybut używany do skojarzenia certyfikatu z usługą.

Element <uwierzytelniania> określa poziom zaufania używany do uwierzytelniania certyfikatów. Domyślnie poziom jest ustawiony na "ChainTrust", który określa, że każdy certyfikat musi być znaleziony w hierarchii certyfikatów kończących się zaufanym urzędem certyfikacji w górnej części łańcucha. Jest to najbardziej bezpieczny tryb. Można również ustawić wartość "PeerOrChainTrust", która określa, że certyfikaty wystawione samodzielnie (zaufanie równorzędne) są akceptowane, a także certyfikaty, które znajdują się w zaufanym łańcuchu. Ta wartość jest używana podczas opracowywania i debugowania klientów i usług, ponieważ certyfikaty wystawione samodzielnie nie muszą być kupowane z zaufanego urzędu. Podczas wdrażania klienta należy zamiast tego użyć wartości "ChainTrust". Można również ustawić wartość na "Niestandardowa" lub "Brak". Aby użyć wartości "Niestandardowe", należy również ustawić CustomCertificateValidatorType atrybut na zestaw i typ używany do weryfikacji certyfikatu. Aby utworzyć własny niestandardowy moduł sprawdzania poprawności, należy dziedziczyć z klasy abstrakcyjnej X509CertificateValidator . Aby uzyskać więcej informacji, zobacz How to: Create a Service that Employs a Custom Certificate Validator (Jak utworzyć usługę, która korzysta z niestandardowego modułu sprawdzania poprawności certyfikatów).

Element <uwierzytelniania> zawiera RevocationMode atrybut określający sposób sprawdzania, w jaki sposób certyfikaty są sprawdzane pod kątem odwołania. Wartość domyślna to "online", co oznacza, że certyfikaty są automatycznie sprawdzane pod kątem odwołania. Aby uzyskać więcej informacji, zobacz Praca z certyfikatami.

ServiceAuthorization

Element <serviceAuthorization> zawiera elementy wpływające na autoryzację, niestandardowych dostawców ról i personifikację.

Klasa PrincipalPermissionAttribute jest stosowana do metody usługi. Atrybut określa grupy użytkowników do użycia podczas autoryzowania użycia chronionej metody. Wartość domyślna to "UseWindowsGroups" i określa, że grupy systemu Windows, takie jak "Administratorzy" lub "Użytkownicy", są wyszukiwane pod kątem tożsamości próbującej uzyskać dostęp do zasobu. Można również określić wartość "UseAspNetRoles", aby użyć niestandardowego dostawcy roli skonfigurowanego <system.web> w ramach elementu, jak pokazano w poniższym kodzie.

<system.web>
  <membership defaultProvider="SqlProvider"
   userIsOnlineTimeWindow="15">
     <providers>
       <clear />
       <add
          name="SqlProvider"
          type="System.Web.Security.SqlMembershipProvider"
          connectionStringName="SqlConn"
          applicationName="MembershipProvider"
          enablePasswordRetrieval="false"
          enablePasswordReset="false"
          requiresQuestionAndAnswer="false"
          requiresUniqueEmail="true"
          passwordFormat="Hashed" />
     </providers>
   </membership>
  <!-- Other configuration code not shown.-->
</system.web>

Poniższy kod przedstawia roleProviderName używany z atrybutem principalPermissionMode .

<behaviors>
 <behavior name="ServiceBehaviour">
  <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                        roleProviderName ="SqlProvider" />
</behavior>
   <!-- Other configuration code not shown. -->
</behaviors>

Konfigurowanie inspekcji zabezpieczeń

<Użyj elementu serviceSecurityAudit>, aby określić dziennik zapisany w dzienniku oraz typy zdarzeń do rejestrowania. Aby uzyskać więcej informacji, zobacz Inspekcja.

<behaviors>
 <serviceBehaviors>
  <behavior name="NewBehavior">
    <serviceSecurityAudit auditLogLocation="Application"
             suppressAuditFailure="true"
             serviceAuthorizationAuditLevel="Success"
             messageAuthenticationAuditLevel="Success" />
  </behavior>
 </serviceBehaviors>
</behaviors>

Bezpieczna wymiana metadanych

Eksportowanie metadanych do klientów jest wygodne dla deweloperów usług i klientów, ponieważ umożliwia pobieranie kodu konfiguracji i klienta. Aby zmniejszyć narażenie usługi na złośliwych użytkowników, można zabezpieczyć transfer przy użyciu mechanizmu SSL za pośrednictwem protokołu HTTP (HTTPS). W tym celu należy najpierw powiązać odpowiedni certyfikat X.509 z określonym portem na komputerze hostujący usługę. (Aby uzyskać więcej informacji, zobacz Praca z certyfikatami). Po drugie dodaj parametr <serviceMetadata> do konfiguracji usługi i ustaw HttpsGetEnabled atrybut na true. Na koniec ustaw HttpsGetUrl atrybut na adres URL punktu końcowego metadanych usługi, jak pokazano w poniższym przykładzie.

<behaviors>
 <serviceBehaviors>
  <behavior name="NewBehavior">
    <serviceMetadata httpsGetEnabled="true"
     httpsGetUrl="https://myComputerName/myEndpoint" />
  </behavior>
 </serviceBehaviors>
</behaviors>

Zobacz też