Megosztás a következőn keresztül:


WCF-biztonság programozása

Ez a témakör a biztonságos Windows Communication Foundation (WCF) alkalmazás létrehozásához használt alapvető programozási feladatokat ismerteti. Ez a témakör csak a hitelesítésre, a bizalmasságra és az integritásra vonatkozik, más néven átviteli biztonságra. Ez a témakör nem terjed ki az engedélyezésre (az erőforrásokhoz vagy szolgáltatásokhoz való hozzáférés ellenőrzésére); az engedélyezésre vonatkozó információkért lásd: Engedélyezés.

Feljegyzés

A biztonsági fogalmak értékes bemutatása, különösen a WCF tekintetében, tekintse meg az MSDN forgatókönyvek, minták és megvalósítási útmutatók webszolgáltatásokhoz készült fejlesztéseihez (W Standard kiadás) 3.0-s verziójának mintáit és gyakorlatait bemutató oktatóanyagokat.

A WCF-biztonság programozása a következő három lépésen alapul: a biztonsági mód, az ügyfél hitelesítő adatainak típusa és a hitelesítő adatok értékei. Ezeket a lépéseket kóddal vagy konfigurációval is végrehajthatja.

A biztonsági mód beállítása

Az alábbiakban a WCF biztonsági móddal történő programozásának általános lépéseit ismertetik:

  1. Válassza ki az alkalmazás követelményeinek megfelelő előre definiált kötéseket. A kötési lehetőségek listáját a Rendszer által biztosított kötések című témakörben találja. Alapértelmezés szerint szinte minden kötéshez engedélyezve van a biztonság. Az egyetlen kivétel az BasicHttpBinding osztály (konfiguráció, az <alapszintűHttpBinding> használata).

    A kiválasztott kötés határozza meg az átvitelt. Például WSHttpBinding HTTP-t használ átvitelként; NetTcpBinding TCP-t használ.

  2. Válassza ki a kötés biztonsági módjainak egyikét. Vegye figyelembe, hogy a kiválasztott kötés határozza meg a választható módokat. Ez például nem teszi lehetővé az WSDualHttpBinding átvitel biztonságát (ez nem egy lehetőség). Hasonlóképpen, sem az MsmqIntegrationBinding üzenetek biztonsága nem teszi lehetővé az NetNamedPipeBinding üzenetek biztonságát.

    Három lehetősége van:

    1. Transport

      Az átviteli biztonság attól függ, hogy milyen mechanizmust használ a kiválasztott kötés. Ha például használ, WSHttpBinding akkor a biztonsági mechanizmus a Secure Sockets Layer (SSL) (szintén a HTTPS protokoll mechanizmusa). Általánosságban elmondható, hogy a közlekedésbiztonság fő előnye, hogy jó átviteli sebességet biztosít, függetlenül attól, hogy melyik szállítást használja. Ennek azonban két korlátja van: Az első az, hogy az átviteli mechanizmus határozza meg a felhasználó hitelesítéséhez használt hitelesítő adatokat. Ez csak akkor hátrány, ha egy szolgáltatásnak más szolgáltatásokkal kell együttműködnie, amelyek különböző típusú hitelesítő adatokat igényelnek. A második az, hogy mivel a biztonság nem az üzenet szintjén van alkalmazva, a biztonság ugrásonként van implementálva, nem pedig végpontok közötti módon. Ez utóbbi korlátozás csak akkor jelent problémát, ha az ügyfél és a szolgáltatás közötti üzenetútvonal közvetítőkre is kiterjed. A használni kívánt átvitelről további információt a Szállítás kiválasztása című témakörben talál. A közlekedésbiztonság használatáról további információt a Közlekedésbiztonság áttekintése című témakörben talál.

    2. Message

      Az üzenetbiztonság azt jelenti, hogy minden üzenet tartalmazza az üzenet biztonságossá tételéhez szükséges fejléceket és adatokat. Mivel a fejlécek összetétele eltérő, tetszőleges számú hitelesítő adatot tartalmazhat. Ez akkor válik tényezővé, ha más olyan szolgáltatásokkal működik együtt, amelyek egy adott hitelesítő adattípust igényelnek, amelyet egy átviteli mechanizmus nem tud biztosítani, vagy ha az üzenetet egynél több szolgáltatással kell használni, ahol minden szolgáltatás más hitelesítőadat-típust igényel.

      További információ: Üzenetbiztonság.

    3. TransportWithMessageCredential

      Ez a választás az átviteli réteget használja az üzenetátvitel biztonságossá tételéhez, míg minden üzenet tartalmazza a más szolgáltatásokhoz szükséges gazdag hitelesítő adatokat. Ez egyesíti az átviteli biztonság teljesítményelőnyét az üzenetbiztonság gazdag hitelesítő adataival. Ez a következő kötésekkel érhető el: BasicHttpBinding, WSFederationHttpBinding, NetPeerTcpBindingés WSHttpBinding.

  3. Ha a HTTP-hez (más néven HTTPS-hez) átviteli biztonságot használ, akkor a gazdagépet SSL-tanúsítvánnyal is konfigurálnia kell, és engedélyeznie kell az SSL-t egy porton. További információ: HTTP Transport Security.

  4. Ha az eszközt WSHttpBinding használja, és nem kell biztonságos munkamenetet létrehoznia, állítsa a tulajdonságot a EstablishSecurityContext következőre false: .

    A biztonságos munkamenet akkor fordul elő, ha az ügyfél és a szolgáltatás szimmetrikus kulccsal hoz létre csatornát (az ügyfél és a kiszolgáló ugyanazt a kulcsot használja a beszélgetés hosszához, amíg a párbeszédpanel be nem záródik).

Az ügyfél hitelesítő adatainak típusának beállítása

Válassza ki az ügyfél hitelesítő adatait a megfelelő módon. További információ: Hitelesítő adattípus kiválasztása. A következő ügyfél-hitelesítő adatok érhetők el:

  • Windows

  • Certificate

  • Digest

  • Basic

  • UserName

  • NTLM

  • IssuedToken

A mód beállításától függően meg kell adnia a hitelesítő adatok típusát. Ha például a wsHttpBindinglehetőséget választotta, és a módot "Üzenet" értékre állította, akkor az clientCredentialType Üzenet elem attribútumát az alábbi értékek egyikére is beállíthatja: None, Windows, UserName, Certificateés IssuedToken, ahogyan az a következő konfigurációs példában látható.

<system.serviceModel>  
<bindings>  
  <wsHttpBinding>  
    <binding name="myBinding">  
      <security mode="Message"/>  
      <message clientCredentialType="Windows"/>  
    </binding>
  </wsHttpBinding>
</bindings>  
</system.serviceModel>  

Vagy kódban:

WSHttpBinding b = new WSHttpBinding();
b.Name = "myBinding";
b.Security.Mode = SecurityMode.Message;
b.Security.Message.ClientCredentialType=MessageCredentialType.Windows;
Dim b As New WSHttpBinding()
b.Name = "myBinding"
b.Security.Mode = SecurityMode.Message
b.Security.Message.ClientCredentialType = MessageCredentialType.Windows

Szolgáltatás hitelesítő adatainak beállítása

Miután kiválasztotta az ügyfél hitelesítő adatait, meg kell adnia a szolgáltatás és az ügyfél tényleges hitelesítő adatait. A szolgáltatásban a hitelesítő adatok az ServiceCredentials osztály használatával vannak beállítva, és az Credentials osztály tulajdonsága ServiceHostBase adja vissza. A használatban lévő kötés magában foglalja a szolgáltatás hitelesítő adatait, a választott biztonsági módot és az ügyfél hitelesítő adatainak típusát. Az alábbi kód beállít egy tanúsítványt egy szolgáltatás hitelesítő adataihoz.

// Create the binding for an endpoint.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Message;

// Create the ServiceHost for a calculator.
Uri baseUri = new Uri("net.tcp://MachineName/tcpBase");
Uri[] baseAddresses = new Uri[] { baseUri };
ServiceHost sh = new ServiceHost(typeof(Calculator), baseAddresses);

// Add an endpoint using the binding and a new address.
Type c = typeof(ICalculator);
sh.AddServiceEndpoint(c, b, "MyEndpoint");

// Set a certificate as the credential for the service.
sh.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindBySubjectName,
    "client.com");
try
{
    sh.Open();
    Console.WriteLine("Listening....");
    Console.ReadLine();
    sh.Close();
}
catch (CommunicationException ce)
{
    Console.WriteLine("A communication error occurred: {0}", ce.Message);
    Console.WriteLine();
}
catch (System.Exception exc)
{
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message);
    Console.ReadLine();
}
' Create the binding for an endpoint.
Dim b As New NetTcpBinding()
b.Security.Mode = SecurityMode.Message

' Create the ServiceHost for a calculator.
Dim baseUri As New Uri("net.tcp://MachineName/tcpBase")
Dim baseAddresses() As Uri = {baseUri}
Dim sh As New ServiceHost(GetType(Calculator), baseAddresses)

' Add an endpoint using the binding and a new address.
Dim c As Type = GetType(ICalculator)
sh.AddServiceEndpoint(c, b, "MyEndpoint")

' Set a certificate as the credential for the service.
sh.Credentials.ServiceCertificate.SetCertificate( _
                StoreLocation.LocalMachine, _
                StoreName.My, _
                X509FindType.FindBySubjectName, _
                "contoso.com")
Try
    sh.Open()
    Console.WriteLine("Listening....")
    Console.ReadLine()
    sh.Close()
Catch ce As CommunicationException
    Console.WriteLine("A communication error occurred: {0}", ce.Message)
    Console.WriteLine()
Catch exc As System.Exception
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message)
    Console.ReadLine()
End Try

Ügyfél hitelesítő adatainak beállítása

Az ügyfélen állítsa be az ügyfél hitelesítő adatait az ClientCredentials osztály használatával, és adja vissza az ClientCredentialsClientBase<TChannel> osztály tulajdonsága által visszaadott értéket. Az alábbi kód hitelesítő adatként állítja be a tanúsítványt egy ügyfélen a TCP protokoll használatával.

// Create a NetTcpBinding and set its security properties. The
// security mode is Message, and the client must be authenticated with
// Windows. Therefore the client must be on the same Windows domain.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Message;
b.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

// Set a Type variable for use when constructing the endpoint.
Type c = typeof(ICalculator);

// Create a base address for the service.
Uri tcpBaseAddress =
    new Uri("net.tcp://machineName.Domain.Contoso.com:8036/serviceName");
// The base address is in an array of URI objects.
Uri[] baseAddresses = new Uri[] { tcpBaseAddress };
// Create the ServiceHost with type and base addresses.
ServiceHost sh = new ServiceHost(typeof(CalculatorClient), baseAddresses);

// Add an endpoint to the service using the service type and binding.
sh.AddServiceEndpoint(c, b, "");
sh.Open();
string address = sh.Description.Endpoints[0].ListenUri.AbsoluteUri;
Console.WriteLine("Listening @ {0}", address);
Console.WriteLine("Press enter to close the service");
Console.ReadLine();
' Create a NetTcpBinding and set its security properties. The
' security mode is Message, and the client must be authenticated with
' Windows. Therefore the client must be on the same Windows domain.
Dim b As New NetTcpBinding()
b.Security.Mode = SecurityMode.Message
b.Security.Message.ClientCredentialType = MessageCredentialType.Windows

' Set a Type variable for use when constructing the endpoint.
Dim c As Type = GetType(ICalculator)

' Create a base address for the service.
Dim tcpBaseAddress As New Uri("net.tcp://machineName.Domain.Contoso.com:8036/serviceName")
' The base address is in an array of URI objects.
Dim baseAddresses() As Uri = {tcpBaseAddress}
' Create the ServiceHost with type and base addresses.
Dim sh As New ServiceHost(GetType(CalculatorClient), baseAddresses)

' Add an endpoint to the service using the service type and binding.
sh.AddServiceEndpoint(c, b, "")
sh.Open()
Dim address As String = sh.Description.Endpoints(0).ListenUri.AbsoluteUri
Console.WriteLine("Listening @ {0}", address)
Console.WriteLine("Press enter to close the service")
Console.ReadLine()

Lásd még