Sdílet prostřednictvím


Zabezpečení zpráv s anonymní metodou

Anonymní ukázka zabezpečení zpráv ukazuje, jak implementovat aplikaci WCF (Windows Communication Foundation), která používá zabezpečení na úrovni zpráv bez ověření klienta, ale vyžaduje ověření serveru pomocí certifikátu X.509 serveru. Všechny zprávy aplikace mezi klientem a serverem jsou podepsané a šifrované. Tato ukázka je založená na ukázce WSHttpBinding . Tato ukázka se skládá z programu konzoly klienta (.exe) a knihovny služeb (.dll) hostované službou Internetová informační služba (IIS). Služba implementuje kontrakt, který definuje komunikační vzor žádosti a odpovědi.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Tato ukázka přidá do rozhraní kalkulačky novou operaci, která se vrátí True , pokud klient nebyl ověřen.

public class CalculatorService : ICalculator
{
    public bool IsCallerAnonymous()
    {
        // ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
        return ServiceSecurityContext.Current.IsAnonymous;
    }
    ...
}

Služba zveřejňuje jeden koncový bod pro komunikaci se službou definovanou pomocí konfiguračního souboru (Web.config). Koncový bod se skládá z adresy, vazby a kontraktu. Vazba je nakonfigurována s vazbou wsHttpBinding . Výchozí režim zabezpečení vazby wsHttpBinding je Message. Atribut clientCredentialType je nastaven na Nonehodnotu .

<system.serviceModel>

  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>

  <bindings>
    <wsHttpBinding>
     <!-- This configuration defines the security mode as Message and -->
     <!-- the clientCredentialType as None. This mode provides -->
     <!-- server authentication only using the service certificate. -->

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

Přihlašovací údaje, které se mají použít pro ověřování služby, se zadají v <chování>. Certifikát serveru musí obsahovat stejnou hodnotu jako SubjectName hodnota zadaná pro findValue atribut, jak je znázorněno v následujícím vzorovém kódu.

<behaviors>
  <serviceBehaviors>
    <behavior>
      <!--
    The serviceCredentials behavior allows you to define a service certificate.
    A service certificate is used by a client to authenticate the service and provide message protection.
    This configuration references the "localhost" certificate installed during the setup instructions.
    -->
      <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
      </serviceCredentials>
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Konfigurace koncového bodu klienta se skládá z absolutní adresy koncového bodu služby, vazby a kontraktu. Režim zabezpečení klienta pro wsHttpBinding vazbu je Message. Atribut clientCredentialType je nastaven na Nonehodnotu .

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

  <bindings>
    <wsHttpBinding>
      <!--This configuration defines the security mode as -->
      <!--Message and the clientCredentialType as None. -->
      <binding name="Binding1">
        <security mode = "Message">
          <message clientCredentialType="None"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

Ukázka nastaví CertificateValidationMode na PeerOrChainTrust ověření certifikátu služby. To se provádí v souboru App.config klienta v behaviors části. To znamená, že pokud je certifikát v úložišti důvěryhodných Lidé uživatele, je důvěryhodný bez ověření řetězu vystavitelů certifikátu. Toto nastavení se tady používá pro usnadnění práce, aby se ukázka spustila bez vyžadování certifikátů vydaných certifikační autoritou . Toto nastavení je méně bezpečné než výchozí hodnota ChainTrust. Před použitím PeerOrChainTrust produkčního kódu byste měli pečlivě zvážit bezpečnostní důsledky tohoto nastavení.

Implementace klienta přidá volání IsCallerAnonymous metody a jinak se neliší od ukázky WSHttpBinding .

// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();

// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());

// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

...

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.

IsCallerAnonymous returned: True
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Dávkový soubor Setup.bat, který je součástí ukázky zabezpečení zpráv, umožňuje nakonfigurovat server s příslušným certifikátem pro spuštění hostované aplikace, která vyžaduje zabezpečení založené na certifikátech. Dávkový soubor lze spustit ve dvou režimech. Chcete-li spustit dávkový soubor v režimu jednoho počítače, zadejte setup.bat na příkazovém řádku. Pokud ho chcete spustit v režimu služby, zadejte setup.bat service. Tento režim použijte při spuštění ukázky napříč počítači. Podrobnosti najdete v postupu nastavení na konci tohoto tématu.

Níže najdete stručný přehled různých částí dávkových souborů:

  • Vytvoření certifikátu serveru

    Následující řádky z dávkového souboru Setup.bat vytvoří certifikát serveru, který se má použít.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    

    Proměnná %SERVER_NAME% určuje název serveru. Certifikát je uložen v úložišti LocalMachine. Pokud je dávkový soubor instalačního programu spuštěn s argumentem služby (například setup.bat service) %SERVER_NAME% obsahuje plně kvalifikovaný název domény počítače. Jinak se výchozí hodnota nastaví na localhost.

  • Instalace certifikátu serveru do důvěryhodného úložiště certifikátů klienta

    Následující řádek zkopíruje certifikát serveru do úložiště důvěryhodných osob klienta. Tento krok je povinný, protože certifikáty generované Makecert.exe nejsou implicitně důvěryhodné klientským systémem. Pokud už máte certifikát, který je kořenový v kořenovém certifikátu klienta ( například certifikát vydaný Microsoftem), tento krok naplnění úložiště klientských certifikátů certifikátem pomocí certifikátu serveru se nevyžaduje.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Udělení oprávnění k privátnímu klíči certifikátu

    Následující řádky v dávkovém souboru Setup.bat vytvoří certifikát serveru uložený v úložišti LocalMachine přístupný pro účet pracovního procesu ASP.NET.

    echo ************
    echo setting privileges on server certificates
    echo ************
    for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE
    (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET
    echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R
    iisreset
    

Poznámka:

Pokud používáte jiné uživatele než USA. Anglickou edici Systému Windows musíte upravit soubor Setup.bat a nahradit NT AUTHORITY\NETWORK SERVICE název účtu místním ekvivalentem.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

Spuštění ukázky na stejném počítači

  1. Ujistěte se, že cesta obsahuje složku, ve které jsou umístěné Makecert.exe a FindPrivateKey.exe.

  2. Spusťte Setup.bat z ukázkové instalační složky v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Tím se nainstalují všechny certifikáty potřebné pro spuštění ukázky.

    Poznámka:

    Dávkový soubor instalačního programu je navržený tak, aby běžel z příkazového řádku pro vývojáře pro Visual Studio. Vyžaduje, aby proměnná prostředí cesty ukazovala na adresář, ve kterém je sada SDK nainstalovaná. Tato proměnná prostředí se automaticky nastaví v rámci příkazového řádku pro vývojáře pro Visual Studio.

  3. Zadáním adresy http://localhost/servicemodelsamples/service.svcověřte přístup ke službě pomocí prohlížeče.

  4. Spusťte Client.exe z \client\bin. Aktivita klienta se zobrazí v aplikaci konzoly klienta.

  5. Pokud klient a služba nemůžou komunikovat, přečtěte si téma Řešení potíží Tipy pro ukázky WCF.

Spuštění ukázky napříč počítači

  1. Vytvořte adresář na počítači služby. Pomocí nástroje pro správu Internetová informační služba (IIS) vytvořte virtuální aplikaci s názvem servicemodelsamples pro tento adresář.

  2. Zkopírujte soubory programu služby z \inetpub\wwwroot\servicemodelsamples do virtuálního adresáře v počítači služby. Ujistěte se, že kopírujete soubory v podadresáři \bin. Zkopírujte také soubory Setup.bat a Cleanup.bat do počítače služby.

  3. Vytvořte adresář v klientském počítači pro binární soubory klienta.

  4. Zkopírujte soubory klientského programu do klientského adresáře v klientském počítači. Zkopírujte také soubory Setup.bat, Cleanup.bat a ImportServiceCert.bat do klienta.

  5. Na serveru spusťte setup.bat service příkazový řádek pro vývojáře pro Visual Studio otevřený s oprávněními správce. Spuštění setup.bat s argumentem service vytvoří certifikát služby s plně kvalifikovaným názvem domény počítače a exportuje certifikát služby do souboru s názvem Service.cer.

  6. Upravte web.config tak, aby odrážel nový název certifikátu (v findValue atributu <serviceCertificate>), který je stejný jako plně kvalifikovaný název domény počítače.

  7. Zkopírujte soubor Service.cer z adresáře služby do klientského adresáře v klientském počítači.

  8. V souboru Client.exe.config na klientském počítači změňte hodnotu adresy koncového bodu tak, aby odpovídala nové adrese vaší služby.

  9. Na klientovi spusťte ImportServiceCert.bat v příkazovém řádku pro vývojáře pro Visual Studio otevřené s oprávněními správce. Tím se certifikát služby naimportuje ze souboru Service.cer do úložiště CurrentUser – Trusted Lidé.

  10. Na klientském počítači spusťte Client.exe z příkazového řádku. Pokud klient a služba nemůžou komunikovat, přečtěte si téma Řešení potíží Tipy pro ukázky WCF.

Vyčištění po ukázce

  • Po dokončení spuštění ukázky spusťte Cleanup.bat ve složce s ukázkami.

Poznámka:

Tento skript při spuštění této ukázky na počítačích neodebere certifikáty služby v klientovi. Pokud jste spustili ukázky wcf (Windows Communication Foundation), které používají certifikáty napříč počítači, nezapomeňte vymazat certifikáty služby nainstalované v úložišti CurrentUser – Trusted Lidé. K tomu použijte následující příkaz: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Například: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.