Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio Message Security Anonymous illustra come implementare un'applicazione Windows Communication Foundation (WCF) che usa la sicurezza a livello di messaggio senza autenticazione client, ma che richiede l'autenticazione server usando il certificato X.509 del server. Tutti i messaggi dell'applicazione tra il client e il server sono firmati e crittografati. Questo esempio è basato sull'esempio WSHttpBinding . Questo esempio è costituito da un programma console client (.exe) e da una libreria di servizi (.dll) ospitata da Internet Information Services (IIS). Il servizio implementa un contratto che definisce un modello di comunicazione request-reply.
Annotazioni
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
In questo esempio viene aggiunta una nuova operazione all'interfaccia calcolatrice che restituisce True se il client non è stato autenticato.
public class CalculatorService : ICalculator
{
public bool IsCallerAnonymous()
{
// ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
return ServiceSecurityContext.Current.IsAnonymous;
}
...
}
Il servizio espone un singolo endpoint per la comunicazione con il servizio, definito usando un file di configurazione (Web.config). L'endpoint è costituito da un indirizzo, un binding e un contratto. L'associazione è configurata con un'associazione wsHttpBinding . La modalità di sicurezza predefinita per l'associazione wsHttpBinding è Message. L'attributo clientCredentialType è impostato su 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>
Le credenziali da usare per l'autenticazione del <servizio vengono specificate nel comportamento>. Il certificato del server deve contenere lo stesso valore per il SubjectName valore specificato per l'attributo findValue , come illustrato nel codice di esempio seguente.
<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>
La configurazione dell'endpoint client è costituita da un indirizzo assoluto per l'endpoint del servizio, il binding e il contratto. La modalità di sicurezza client per l'associazione wsHttpBinding è Message. L'attributo clientCredentialType è impostato su 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>
L'esempio imposta CertificateValidationMode su PeerOrChainTrust per l'autenticazione del certificato del servizio. Questa operazione viene eseguita nel file App.config del client nella behaviors sezione . Ciò significa che se il certificato si trova nell'archivio Persone attendibili dell'utente, è attendibile senza eseguire una convalida della catena di autorità di certificazione del certificato. Questa impostazione viene usata qui per praticità in modo che l'esempio possa essere eseguito senza richiedere certificati rilasciati da un'autorità di certificazione (CA). Questa impostazione è meno sicura rispetto all'impostazione predefinita ChainTrust. Le implicazioni di sicurezza di questa impostazione devono essere considerate attentamente prima di usare PeerOrChainTrust nel codice di produzione.
L'implementazione client aggiunge una chiamata al IsCallerAnonymous metodo e in caso contrario non differisce dall'esempio 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();
Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client. Premere INVIO nella finestra del client per chiudere il client.
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.
Il Setup.bat file batch incluso nell'esempio Anonimo di sicurezza dei messaggi consente di configurare il server con un certificato pertinente per eseguire un'applicazione ospitata che richiede la sicurezza basata su certificati. Il file batch può essere eseguito in due modalità. Per eseguire il file batch in modalità computer singolo, digitare setup.bat nella riga di comando. Per eseguirlo in modalità servizio, digitare setup.bat service. Usare questa modalità quando si esegue l'esempio in tutti i computer. Per informazioni dettagliate, vedere la procedura di installazione alla fine di questo argomento.
Di seguito viene fornita una breve panoramica delle diverse sezioni dei file batch:
Creazione del certificato del server.
Le righe seguenti del file batch Setup.bat creano il certificato server da usare.
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 -peLa variabile %SERVER_NAME% specifica il nome del server. Il certificato viene archiviato nell'archivio LocalMachine. Se il file batch di installazione viene eseguito con un argomento di servizio ,ad esempio
setup.bat service, il %SERVER_NAME% contiene il nome di dominio completo del computer. In caso contrario, l'impostazione predefinita è localhost.Installazione del certificato server nell'archivio certificati attendibile del client.
La riga seguente copia il certificato del server nell'archivio persone attendibili del client. Questo passaggio è obbligatorio perché i certificati generati da Makecert.exe non sono considerati implicitamente attendibili dal sistema client. Se si dispone già di un certificato radicato in un certificato radice attendibile per il client, ad esempio un certificato rilasciato da Microsoft, questo passaggio di popolamento dell'archivio certificati del client con il certificato del server non è obbligatorio.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeopleConcessione delle autorizzazioni per la chiave privata del certificato.
Le righe seguenti nel file batch Setup.bat rendono il certificato server archiviato nell'archivio LocalMachine accessibile all'account del processo di lavoro 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
Annotazioni
Se si utilizza una versione inglese di Windows diversa da quella statunitense, è necessario modificare il file Setup.bat e sostituire il nome dell'account NT AUTHORITY\NETWORK SERVICE con il corrispondente regionale.
Per configurare, compilare ed eseguire l'esempio
Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.
Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Per eseguire l'esempio nello stesso computer
Assicurarsi che il percorso includa la cartella in cui si trovano Makecert.exe e FindPrivateKey.exe.
Eseguire Setup.bat dalla cartella di installazione di esempio in un prompt dei comandi per sviluppatori di Visual Studio avviato con privilegi di amministratore. Vengono installati tutti i certificati necessari per l'esecuzione dell'esempio.
Annotazioni
Il file batch di installazione è progettato per essere eseguito da un prompt dei comandi per gli sviluppatori per Visual Studio. Richiede che la variabile di ambiente del percorso punti alla directory in cui è installato l'SDK. Questa variabile di ambiente viene impostata automaticamente all'interno di un prompt dei comandi per gli sviluppatori per Visual Studio.
Verificare l'accesso al servizio usando un browser immettendo l'indirizzo
http://localhost/servicemodelsamples/service.svc.Avvia Client.exe da \client\bin. L'attività client viene visualizzata nell'applicazione console client.
Se il client e il servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi per gli esempi WCF.
Per eseguire l'esempio tra computer
Creare una directory nel computer del servizio. Creare un'applicazione virtuale denominata servicemodelsamples per questa directory usando lo strumento di gestione Internet Information Services (IIS).
Copiare i file di programma del servizio da \inetpub\wwwroot\servicemodelsamples alla directory virtuale nel computer del servizio. Assicurarsi di copiare i file nella sottodirectory \bin. Copiare anche i file Setup.bat e Cleanup.bat nel computer del servizio.
Creare una directory nel computer client per i file binari del client.
Copiare i file del programma cliente nella cartella client sul computer cliente. Copiare anche i file Setup.bat, Cleanup.bate ImportServiceCert.bat nel client.
Nel server eseguire
setup.bat servicein un prompt dei comandi per gli sviluppatori per Visual Studio aperto con privilegi di amministratore. L'esecuzione disetup.batcon l'argomentoservicecrea un certificato del servizio con il nome di dominio completo del computer ed esporta il certificato del servizio in un file denominato Service.cer.Modificare Web.config in modo da riflettere il nuovo nome del certificato (nell'attributo
findValuenel <serviceCertificate>), che corrisponde al nome di dominio completo del computer.Copiare il file Service.cer dalla directory del servizio alla directory client nel computer client.
Nel file Client.exe.config, sul computer client, modificare il valore dell'indirizzo dell'endpoint affinché corrisponda al nuovo indirizzo del servizio.
Nel client eseguire ImportServiceCert.bat in un prompt dei comandi per gli sviluppatori per Visual Studio aperto con privilegi di amministratore. Questo importa il certificato del servizio dal file Service.cer nell'archivio CurrentUser - TrustedPeople.
Sul computer client, esegui Client.exe da un prompt dei comandi. Se il client e il servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi per gli esempi WCF.
Per eseguire la pulizia dopo l'esempio
- Eseguire Cleanup.bat nella cartella samples dopo aver completato l'esecuzione dell'esempio.
Annotazioni
Questo script non rimuove i certificati del servizio in un client durante l'esecuzione di questo esempio tra computer. Se hai eseguito esempi di Windows Communication Foundation (WCF) che usano certificati su diversi computer, assicurati di cancellare i certificati di servizio che sono stati installati nell'archivio CurrentUser - TrustedPeople. A tale scopo, usare il comando seguente: Ad esempio: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.