Dela via


Anonym meddelandesäkerhet

Exemplet Anonym meddelandesäkerhet visar hur du implementerar ett WCF-program (Windows Communication Foundation) som använder säkerhet på meddelandenivå utan klientautentisering, men som kräver serverautentisering med hjälp av serverns X.509-certifikat. Alla programmeddelanden mellan klienten och servern är signerade och krypterade. Det här exemplet baseras på WSHttpBinding-exemplet . Det här exemplet består av ett klientkonsolprogram (.exe) och ett tjänstbibliotek (.dll) som hanteras av Internet Information Services (IIS). Tjänsten implementerar ett kontrakt som definierar ett kommunikationsmönster för begäran-svar.

Kommentar

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Det här exemplet lägger till en ny åtgärd i kalkylatorgränssnittet som returnerar True om klienten inte autentiserades.

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

Tjänsten exponerar en enskild slutpunkt för kommunikation med tjänsten, definierad med hjälp av en konfigurationsfil (Web.config). Slutpunkten består av en adress, en bindning och ett kontrakt. Bindningen konfigureras med en wsHttpBinding bindning. Standardsäkerhetsläget för bindningen wsHttpBinding är Message. Attributet clientCredentialType är inställt på None.

<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>

De autentiseringsuppgifter som ska användas för tjänstautentisering anges i beteendet><. Servercertifikatet måste innehålla samma värde för SubjectName som värdet som angetts för findValue attributet enligt följande exempelkod.

<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>

Klientslutpunktskonfigurationen består av en absolut adress för tjänstslutpunkten, bindningen och kontraktet. Klientsäkerhetsläget för bindningen wsHttpBinding är Message. Attributet clientCredentialType är inställt på None.

<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>

Exemplet anger CertificateValidationMode till för att PeerOrChainTrust autentisera tjänstens certifikat. Detta görs i klientens App.config-fil i behaviors avsnittet . Det innebär att om certifikatet finns i användarens betrodda Personer arkiv är det betrott utan att utföra en validering av certifikatets utfärdarkedja. Den här inställningen används här för enkelhetens skull så att exemplet kan köras utan att kräva certifikat som utfärdats av en certifikatutfärdare (CA). Den här inställningen är mindre säker än standardinställningen ChainTrust. Säkerhetskonsekvenserna av den här inställningen bör övervägas noggrant innan du använder PeerOrChainTrust i produktionskoden.

Klientimplementeringen lägger till ett anrop till IsCallerAnonymous metoden och skiljer sig annars inte från WSHttpBinding-exemplet .

// 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();

När du kör exemplet visas åtgärdsbegäranden och svar i klientkonsolfönstret. Tryck på RETUR i klientfönstret för att stänga av klienten.

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.

Med Setup.bat batchfil som ingår i exemplet Anonym meddelandesäkerhet kan du konfigurera servern med ett relevant certifikat för att köra ett värdbaserat program som kräver certifikatbaserad säkerhet. Batchfilen kan köras i två lägen. Om du vill köra batchfilen i läget för en dator skriver du setup.bat på kommandoraden. Om du vill köra den i tjänstläge skriver du setup.bat service. Använd det här läget när du kör exemplet mellan datorer. Mer information finns i installationsproceduren i slutet av det här avsnittet.

Följande ger en kort översikt över de olika avsnitten i batchfilerna:

  • Skapa servercertifikatet.

    Följande rader från Setup.bat batchfil skapar det servercertifikat som ska användas.

    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
    

    Variabeln %SERVER_NAME% anger servernamnet. Certifikatet lagras i LocalMachine-arkivet. Om batchfilen för installation körs med ett tjänstargument (till exempel setup.bat service) innehåller %SERVER_NAME% datorns fullständigt kvalificerade domännamn. Annars är den som standard localhost.

  • Installera servercertifikatet i klientens betrodda certifikatarkiv.

    Följande rad kopierar servercertifikatet till det betrodda klientarkivet. Det här steget krävs eftersom certifikat som genereras av Makecert.exe inte är implicit betrodda av klientsystemet. Om du redan har ett certifikat som är rotat i ett klientbetrott rotcertifikat, till exempel ett Microsoft-utfärdat certifikat, krävs inte det här steget för att fylla i klientcertifikatarkivet med servercertifikatet.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Bevilja behörigheter för certifikatets privata nyckel.

    Följande rader i Setup.bat batchfil gör servercertifikatet som lagras i LocalMachine-arkivet tillgängligt för ASP.NET arbetsprocesskontot.

    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
    

Kommentar

Om du använder en icke-AMERIKANSK Den engelska versionen av Windows måste du redigera filen Setup.bat och ersätta NT AUTHORITY\NETWORK SERVICE kontonamnet med din regionala motsvarighet.

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

Så här kör du exemplet på samma dator

  1. Kontrollera att sökvägen innehåller mappen där Makecert.exe och FindPrivateKey.exe finns.

  2. Kör Setup.bat från exempelinstallationsmappen i en kommandotolk för utvecklare för Visual Studio som körs med administratörsbehörighet. Detta installerar alla certifikat som krävs för att köra exemplet.

    Kommentar

    Installationsbatchfilen är utformad för att köras från en kommandotolk för utvecklare för Visual Studio. Det kräver att variabeln sökvägsmiljö pekar på katalogen där SDK:et är installerat. Den här miljövariabeln anges automatiskt i en kommandotolk för utvecklare för Visual Studio.

  3. Kontrollera åtkomsten till tjänsten med hjälp av en webbläsare genom att ange adressen http://localhost/servicemodelsamples/service.svc.

  4. Starta Client.exe från \client\bin. Klientaktiviteten visas i klientkonsolprogrammet.

  5. Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.

Så här kör du exemplet mellan datorer

  1. Skapa en katalog på tjänstdatorn. Skapa ett virtuellt program med namnet servicemodelsamples för den här katalogen med hjälp av IIS-hanteringsverktyget (Internet Information Services).

  2. Kopiera tjänstprogramfilerna från \inetpub\wwwroot\servicemodelsamples till den virtuella katalogen på tjänstdatorn. Se till att du kopierar filerna i underkatalogen \bin. Kopiera även Setup.bat- och Cleanup.bat-filerna till tjänstdatorn.

  3. Skapa en katalog på klientdatorn för klient binärfilerna.

  4. Kopiera klientprogramfilerna till klientkatalogen på klientdatorn. Kopiera även filerna Setup.bat, Cleanup.bat och ImportServiceCert.bat till klienten.

  5. På servern kör du setup.bat service i en kommandotolk för utvecklare för Visual Studio som öppnats med administratörsbehörighet. När du service kör setup.bat med argumentet skapas ett tjänstcertifikat med datorns fullständigt kvalificerade domännamn och tjänstcertifikatet exporteras till en fil med namnet Service.cer.

  6. Redigera Web.config för att återspegla det nya certifikatnamnet (i findValue attributet i <serviceCertificate>), som är samma som datorns fullständigt kvalificerade domännamn.

  7. Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.

  8. I filen Client.exe.config på klientdatorn ändrar du slutpunktens adressvärde så att det matchar tjänstens nya adress.

  9. På klienten kör du ImportServiceCert.bat i en kommandotolk för utvecklare för Visual Studio som öppnas med administratörsbehörighet. Detta importerar tjänstcertifikatet från filen Service.cer till arkivet CurrentUser – Trusted Personer.

  10. Starta Client.exe från en kommandotolk på klientdatorn. Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.

Rensa efter exemplet

  • Kör Cleanup.bat i exempelmappen när du har kört exemplet.

Kommentar

Det här skriptet tar inte bort tjänstcertifikat på en klient när du kör det här exemplet på flera datorer. Om du har kört WCF-exempel (Windows Communication Foundation) som använder certifikat mellan datorer måste du rensa de tjänstcertifikat som har installerats i arkivet CurrentUser – Trusted Personer. Det gör du genom att använda följande kommando: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Till exempel: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.