Esempio identità del servizioService Identity Sample

Questo esempio di identità del servizio illustra come impostare l'identità di un servizio.This service identity sample demonstrates how to set the identity for a service. In fase di progettazione, un client può recuperare l'identità utilizzando i metadati del servizio e quindi al runtime il client può autenticare l'identità del servizio.At design time, a client can retrieve the identity using the service's metadata and then at runtime the client can authenticate the service's identity. Il concetto di identità del servizio serve per consentire a un client di autenticare un servizio prima di chiamare qualsiasi operazione, proteggendo in questo modo il client da chiamate non autenticate.The concept of service identity is to allow a client to authenticate a service before calling any of its operations, thereby protecting the client from unauthenticated calls. Su una connessione sicura il servizio autentica anche le credenziali di un client prima di consentirgli l'accesso, ma questo non è il punto centrale dell'esempio.On a secure connection the service also authenticates a client's credentials before allowing it access, but this is not the focus of this sample. Vedere gli esempi in Client che mostra l'autenticazione server.See the samples in Client that show server authentication.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.The setup procedure and build instructions for this sample are located at the end of this topic.

In questo esempio vengono illustrate le funzionalità seguenti:This sample illustrates the following features:

  • Come impostare tipi diversi di identità su endpoint diversi per un servizio.How to set the different types of identity on different endpoints for a service. Ogni tipo di identità ha funzionalità diverse.Each type of identity has different capabilities. Il tipo di identità da utilizzare dipende dal tipo di credenziali di sicurezza utilizzato sull'associazione dell'endpoint.The type of identity to use is dependent on the type of security credentials used on the endpoint's binding.

  • L'identità può essere impostata in modo dichiarativo a livello di configurazione o in modo imperativo a livello di codice.Identity can either be set declaratively in configuration or imperatively in code. In genere, sia per il client che per il servizio, per impostare l'identità, è necessario utilizzare la configurazione.Typically for both the client and the service you should use configuration to set the identity.

  • Come impostare un'identità personalizzata in un clientHow to set a custom identity on the client. Un'identità personalizzata è in genere una personalizzazione di un tipo esistente di identità che consente al client di esaminare le altre informazioni della richiesta fornite nelle credenziali del servizio per prendere decisioni di autorizzazione prima di chiamare il servizio.A custom identity is typically a customization of an existing type of identity that enables the client to examine other claim information provided in the service's credentials to make authorization decisions before calling the service.

    Nota

    Questo esempio controlla l'identità di un certificato specifico chiamato identity.com e la chiave RSA contenuta al suo interno.This sample checks the identity of a specific certificate called identity.com and the RSA key contained within this certificate. Quando si utilizzano i tipi di identità del certificato e di RSA nella configurazione del client, un modo semplice per ottenere questi valori è di controllare il WSDL del servizio dove questi valori vengono serializzati.When using the Certificate and RSA identity types in configuration on the client, an easy way to get these values is to inspect the WSDL for the service where these values are serialized.

Nel codice di esempio seguente viene mostrato come configurare l'identità di un endpoint del servizio con il DNS di un certificato utilizzando un'associazione WSHttpBinding.The following sample code shows how to configure the identity of a service endpoint with the Domain Name Server (DNS) of a certificate using a WSHttpBinding.

//Create a service endpoint and set its identity to the certificate's DNS                 
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);  
// Client are Anonymous to the service  
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;  
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);  
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));  
ep.Address = epa;  

L'identità può anche essere specificata in fase di configurazione nel file App.config.The identity can also be specified in configuration in the App.config file. Nell'esempio seguente viene mostrato come impostare l'identità di UPN (User Principal Name) per un endpoint del servizio.The following example shows how to set the UPN (User Principal Name) identity for a service endpoint.

<endpoint address="upnidentity"  
        behaviorConfiguration=""  
        binding="wsHttpBinding"  
        bindingConfiguration="WSHttpBinding_Windows"  
        name="WSHttpBinding_ICalculator_Windows"  
        contract="Microsoft.ServiceModel.Samples.ICalculator">  
  <!-- Set the UPN identity for this endpoint -->  
  <identity>  
      <userPrincipalName value="host\myservice.com" />  
  </identity >  
</endpoint>  

Un'identità personalizzata può essere impostata sul client derivando dalle classi EndpointIdentity e IdentityVerifier.A custom identity can be set on the client by deriving from the EndpointIdentity and the IdentityVerifier classes. Concettualmente la classe IdentityVerifier può essere considerata l'equivalente client della classe AuthorizationManager del servizio.Conceptually the IdentityVerifier class can be considered to be the client equivalent of the service's AuthorizationManager class. Nell'esempio di codice seguente viene mostrata un'implementazione di OrgEndpointIdentity che archivia il nome di un'organizzazione affinché corrisponda al nome dell'oggetto del certificato del server.The following code example shows an implementation of OrgEndpointIdentity, which stores an organization name to match in the subject name of the server's certificate. Il controllo dell'autorizzazione per il nome dell'organizzazione si verifica nel metodo CheckAccess sulla classe CustomIdentityVerifier.The authorization check for the organization name occurs in the CheckAccess method on the CustomIdentityVerifier class.

// This custom EndpointIdentity stores an organization name   
public class OrgEndpointIdentity : EndpointIdentity  
{  
    private string orgClaim;  
    public OrgEndpointIdentity(string orgName)  
    {  
        orgClaim = orgName;  
    }  
    public string OrganizationClaim  
    {  
        get { return orgClaim; }  
        set { orgClaim = value; }  
    }  
}  

//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to  
//check that X.509 certificate's distinguished name claim contains  
//the organization name e.g. the string value "O=Contoso"   
class CustomIdentityVerifier : IdentityVerifier  
{  
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)  
    {  
        bool returnvalue = false;  
        foreach (ClaimSet claimset in authContext.ClaimSets)  
        {  
            foreach (Claim claim in claimset)  
            {  
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")  
                {  
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;  
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))  
                    {  
                        Console.WriteLine("Claim Type: {0}",claim.ClaimType);  
                        Console.WriteLine("Right: {0}", claim.Right);  
                        Console.WriteLine("Resource: {0}",claim.Resource);  
                        Console.WriteLine();  
                        returnvalue = true;  
                    }  
                }  
            }  
        }  
        return returnvalue;  
    }  
}  

Questo esempio utilizza un certificato chiamato identity.com che è situato nella cartella Identity della soluzione specifica del linguaggio.This sample uses a certificate called identity.com which is in the language-specific Identity solution folder.

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Assicurarsi di avere eseguito la procedura di installazione singola per gli esempi di Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Per eseguire l'esempio in una configurazione a una o più computer, seguire le istruzioni in esegue gli esempi di Windows Communication Foundation.To run the sample in a single- or cross-computer configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Per eseguire l'esempio nello stesso computerTo run the sample on the same computer

  1. In Windows XPWindows XP o Windows VistaWindows Vista importare il file del certificato Identity.pfx nella cartella Identity della soluzione nell'archivio dei certificati LocalMachine/My (personale) utilizzando lo strumento snap-in MMC.On Windows XPWindows XP or Windows VistaWindows Vista, import the Identity.pfx certificate file in the Identity solution folder into the LocalMachine/My (Personal) certificate store using the MMC snap-in tool. Questo file è protetto da password.This file is password protected. Durante l'importazione viene richiesta una password.During the import you are asked for a password. Tipo xyz nella casella della password.Type xyz into the password box. Per ulteriori informazioni, vedere il procedura: visualizzare certificati con lo Snap-in MMC argomento.For more information, see the How to: View Certificates with the MMC Snap-in topic. Completata questa operazione, eseguire Setup.bat in un prompt dei comandi di Visual Studio con privilegi di amministratore che copia questo certificato nell'archivio CurrentUser/TrustedPeople per l'utilizzo sul client.Once this is done, run Setup.bat in a Visual Studio command prompt with administrator privileges, which copies this certificate to the CurrentUser/Trusted People store for use on the client.

  2. In Windows Server 2003Windows Server 2003 eseguire Setup.bat dalla cartella di installazione dell'esempio in un prompt dei comandi di Visual Studio 2012Visual Studio 2012 con privilegi di amministratore.On Windows Server 2003Windows Server 2003, run Setup.bat from the sample install folder inside a Visual Studio 2012Visual Studio 2012 command prompt with administrator privileges. In questo modo vengono installati tutti i certificati necessari per l'esecuzione dell'esempio.This installs all the certificates required for running the sample.

    Nota

    Il file batch Setup.bat è progettato per essere eseguito da un prompt dei comandi di Visual Studio 2012Visual Studio 2012.The Setup.bat batch file is designed to be run from a Visual Studio 2012Visual Studio 2012 Command Prompt. La variabile di ambiente PATH impostata nel prompt dei comandi di Visual Studio 2012Visual Studio 2012 punta alla directory che contiene file eseguibili richiesti dallo script Setup.bat.The PATH environment variable set within the Visual Studio 2012Visual Studio 2012 Command Prompt points to the directory that contains executables required by the Setup.bat script. Assicurarsi di rimuovere i certificati eseguendo Cleanup.bat una volta completato l'esempio.Ensure that you remove the certificates by running Cleanup.bat when you have finished with the sample. Negli altri esempi relativi alla sicurezza vengono usati gli stessi certificati.Other security samples use the same certificates.

  3. Avviare Service.exe dalla directory \service\bin.Launch Service.exe from the \service\bin directory. Verificare che il servizio indica che è pronto e viene chiesto di premere <Invio > per terminare il servizio.Ensure that the service indicates that it is ready and displays a prompt to Press <Enter> to terminate the service.

  4. Avviare Client.exe dalla directory \client\bin o premendo F5 in Visual Studio per compilare ed eseguire l'esempio.Launch Client.exe from \client\bin directory or by pressing F5 in Visual Studio to build and run. L'attività del client viene visualizzata nella finestra dell'applicazione console.Client activity is displayed on the client console application.

  5. Se il client e il servizio non sono in grado di comunicare, vedere suggerimenti per la risoluzione dei problemi.If the client and service are not able to communicate, see Troubleshooting Tips.

Per eseguire l'esempio tra più computerTo run the sample across computers

  1. Prima di compilare la parte client dell'esempio, assicurarsi di aver modificato il valore dell'indirizzo endpoint del servizio nel file Client.cs nel metodo CallServiceCustomClientIdentity.Before building the client part of the sample, be sure to change the value for the service's endpoint address in the Client.cs file in the CallServiceCustomClientIdentity method. Quindi compilare l'esempio.Then build the sample.

  2. Creare una directory sul computer del servizio.Create a directory on the service computer.

  3. Copiare i file di programma del servizio da \service\bin nella directory del computer del servizio.Copy the service program files from service\bin to the directory on the service computer. Copiare i file Setup.bat e Cleanup.bat nel computer del servizio.Also copy the Setup.bat and Cleanup.bat files to the service computer.

  4. Creare una directory sul client del servizio per i file binari del client.Create a directory on the client computer for the client binaries.

  5. Copiare i file di programma del client nella directory del client sul computer relativoCopy the client program files to the client directory on the client computer. e i file Setup.bat, Cleanup.bat e ImportServiceCert.bat nel client.Also copy the Setup.bat, Cleanup.bat, and ImportServiceCert.bat files to the client.

  6. Sul server aprire un prompt dei comandi di Visual Studio con privilegi di amministratore, quindi digitare setup.bat service.On the service, run setup.bat service in a Visual Studio command prompt opened with administrator privileges. Esecuzione setup.bat con il service argomento crea un certificato di servizio con il nome di dominio completo del computer e il certificato di servizio viene esportato in un file denominato Service.cer.Running setup.bat with the service argument creates a service certificate with the fully-qualified domain name of the computer and exports the service certificate to a file named Service.cer.

  7. Copiare il file Service.cer dalla directory del servizio nella directory del client sul computer relativo.Copy the Service.cer file from the service directory to the client directory on the client computer.

  8. Nel file Client.exe.config presente nel computer client modificare il valore dell'indirizzo della definizione dell'endpoint in base al nuovo indirizzo del servizio.In the Client.exe.config file on the client computer, change the address value of the endpoint to match the new address of your service. Sono presenti più istanze che devono essere modificate.There are multiple instances that must be changed.

  9. Sul client aprire un prompt dei comandi di Visual Studio con privilegi di amministratore ed eseguire ImportServiceCert.bat.On the client, run ImportServiceCert.bat in a Visual Studio command prompt opened with administrator privileges. In questo modo viene importato il certificato del servizio dal file Service.cer nell'archivio CurrentUser - TrustedPeople.This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store.

  10. Sul computer del servizio eseguire Service.exe dal prompt dei comandi.On the service computer, launch the Service.exe from the command prompt.

  11. Sul computer client avviare Client.exe da un prompt dei comandi.On the client computer, launch Client.exe from a command prompt. Se il client e il servizio non sono in grado di comunicare, vedere suggerimenti per la risoluzione dei problemi.If the client and service are not able to communicate, see Troubleshooting Tips.

Per eseguire la pulizia dopo l'esempioTo clean up after the sample

  • Eseguire Cleanup.bat nella cartella degli esempi una volta completato l'esempio.Run Cleanup.bat in the samples folder once you have finished running the sample.

    Nota

    Questo script non rimuove i certificati del servizio da un client quando si esegue l'esempio tra più computer.This script does not remove service certificates on a client when running this sample across computers. Se sono stati eseguiti esempi di Windows Communication Foundation (WCF) che usano certificati tra più computer, assicurarsi di cancellare i certificati del servizio che sono stati installati nell'archivio CurrentUser - TrustedPeople.If you have run Windows Communication Foundation (WCF) samples that use certificates across computers, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. Per eseguire questa operazione, usare il seguente comando: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Ad esempio: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.To do this, use the following command: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Vedere ancheSee Also