Servizio facciata attendibileTrusted Facade Service

Questo scenario viene illustrato come propagare le informazioni di identità del chiamante da un servizio a un altro, usando Windows Communication Foundation (WCF) infrastruttura di sicurezza.This scenario sample demonstrates how to flow caller's identity information from one service to another using Windows Communication Foundation (WCF) security infrastructure.

Si tratta di un modello di progettazione comune per esporre la funzionalità fornita da un servizio alla rete pubblica usando un servizio di facciata.It is a common design pattern to expose the functionality provided by a service to the public network using a façade service. Il servizio di facciata risiede in genere nella rete perimetrale e comunica con un servizio back-end che implementa la regola business e ha accesso ai dati interni.The façade service typically resides in the perimeter network (also known as DMZ, demilitarized zone, and screened subnet) and communicates with a backend service that implements the business logic and has access to internal data. Il canale di comunicazione tra il servizio di facciata e il servizio back-end passa attraverso un firewall e in genere è limitato a un solo obiettivo.The communication channel between the façade service and the backend service goes through a firewall and is usually limited for a single purpose only.

L'esempio è costituito dai componenti seguenti:This sample consists of the following components:

  • Client calcolatriceCalculator client

  • Servizio di facciata calcolatriceCalculator façade service

  • Servizio back-end calcolatriceCalculator backend service

Il servizio di facciata ha la responsabilità di convalidare la richiesta e autenticare il chiamante.The façade service is responsible for validating the request and authenticating the caller. Una volta completate correttamente l'autenticazione e la convalida, inoltra la richiesta al servizio back-end usando il canale di comunicazione controllato dalla rete perimetrale alla rete interna.After successful authentication and validation, it forwards the request to the backend service using the controlled communication channel from the perimeter network to the internal network. I servizio di facciata include come parte della richiesta inoltrata informazioni sull'identità del chiamante, in modo che il servizio back-end possa usare queste informazioni nell'elaborazione.As a part of the forwarded request, the façade service includes information about the caller's identity so that the backend service can use this information in its processing. L'identità del chiamante viene trasmessa usando un token di sicurezza Username all'interno dell'intestazione di Security del messaggio.The caller's identity is transmitted using a Username security token inside the message Security header. L'esempio utilizza l'infrastruttura di sicurezza WCF per trasmettere ed estrarre queste informazioni dal Security intestazione.The sample uses the WCF security infrastructure to transmit and extract this information from the Security header.

Importante

Il servizio back-end considera attendibile il servizio di facciata per autenticare il chiamante.The backend service trusts the façade service to authenticate the caller. Di conseguenza il servizio back-end non autentica nuovamente il chiamante, ma usa le informazioni di identità fornite dal servizio di facciata nella richiesta inoltrata.Because of this, the backend service does not authenticate the caller again; it uses the identity information provided by the façade service in the forwarded request. A causa di questa relazione di trust, il servizio back-end deve autenticare il servizio di facciata in modo da assicurare che il messaggio inoltrato provenga da una fonte attendibile, in questo caso, dal servizio di facciata.Because of this trust relationship, the backend service must authenticate the façade service to ensure that the forwarded message comes from a trusted source - in this case, the façade service.

ImplementazioneImplementation

In questo esempio vengono riportati due percorsi di comunicazione.There are two communication paths in this sample. Il primo è tra il client e il servizio di facciata, il secondo è tra il servizio di facciata e il servizio back-end.First is between the client and the façade service, the second is between the façade service and the backend service.

Percorso di comunicazione tra il client e il servizio di facciataCommunication Path between Client and Façade Service

Il percorso di comunicazione dal client al servizio di facciata usa wsHttpBinding con un tipo di credenziale UserName .The client to the façade service communication path uses wsHttpBinding with a UserName client credential type. Questo significa che il client usa il nome utente e la password per autenticare al servizio di facciata e il servizio di facciata usa il certificato X.509 per autenticare il client.This means that the client uses username and password to authenticate to the façade service and the façade service uses X.509 certificate to authenticate to the client. L'aspetto della configurazione dell'associazione è analogo al seguente:The binding configuration looks like the following example.

<bindings>  
  <wsHttpBinding>  
    <binding name="Binding1">  
      <security mode="Message">  
        <message clientCredentialType="UserName"/>  
      </security>  
    </binding>  
  </wsHttpBinding>  
</bindings>  

Il servizio di facciata autentica il chiamante usando l'implementazione UserNamePasswordValidator personalizzata.The façade service authenticates the caller using custom UserNamePasswordValidator implementation. A scopo dimostrativo, l'autenticazione assicura solo che il nome utente del chiamante corrisponda alla password presentata.For demonstration purposes, the authentication only ensures that the caller's username matches the presented password. Nella situazione del mondo reale l'utente viene probabilmente autenticato usando Active Directory o un provider di appartenenze ASP.NET personalizzato.In the real world situation, the user is probably authenticated using Active Directory or custom ASP.NET Membership provider. L'implementazione del validator si trova nel file FacadeService.cs .The validator implementation resides in FacadeService.cs file.

public class MyUserNamePasswordValidator : UserNamePasswordValidator  
{  
    public override void Validate(string userName, string password)  
    {  
        // check that username matches password  
        if (null == userName || userName != password)  
        {  
            Console.WriteLine("Invalid username or password");  
            throw new SecurityTokenValidationException(  
                       "Invalid username or password");  
        }  
    }  
}  

Il validator personalizzato viene configurato per essere usato nel comportamento serviceCredentials nel file di configurazione del servizio di facciata.The custom validator is configured to be used inside the serviceCredentials behavior in the façade service configuration file. Questo comportamento viene inoltre usato per configurare il certificato X.509 del servizio.This behavior is also used to configure the service's X.509 certificate.

<behaviors>  
  <serviceBehaviors>  
    <behavior name="FacadeServiceBehavior">  
      <!--The serviceCredentials behavior allows you to define -->  
      <!--a service certificate. -->  
      <!--A service certificate is used by the service to  -->  
      <!--authenticate itself to its clients and to provide  -->  
      <!--message protection. -->  
      <!--This configuration references the "localhost"  -->  
      <!--certificate installed during the setup instructions. -->  
      <serviceCredentials>  
        <serviceCertificate   
               findValue="localhost"   
               storeLocation="LocalMachine"   
               storeName="My"   
               x509FindType="FindBySubjectName" />  
        <userNameAuthentication userNamePasswordValidationMode="Custom"  
            customUserNamePasswordValidatorType=  
           "Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator,  
            FacadeService"/>  
      </serviceCredentials>  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  

Percorso di comunicazione tra il servizio di facciata e il servizio back-endCommunication Path between Façade Service and Backend Service

Il percorso di comunicazione dal servizio di facciata al servizio back-end usa un customBinding costituito da molti elementi di associazione.The façade service to the backend service communication path uses a customBinding that consists of several binding elements. Questa associazione consente di raggiungere due obiettivi.This binding accomplishes two things. Autentica il servizio di facciata e il servizio back-end per assicurare che la comunicazione sia protetta e che provenga da una fonte attendibile.It authenticates the façade service and backend service to ensure that the communication is secure and is coming from a trusted source. Trasmette inoltre l'identità del chiamante iniziale all'interno del token di sicurezza Username .Additionally, it also transmits the initial caller's identity inside the Username security token. In questo caso, solo il nome utente del chiamante iniziale viene trasmesso al servizio back-end, la password non viene inclusa nel messaggio.In this case, only the initial caller's username is transmitted to the backend service, the password is not included in the message. Questo è dovuto al fatto che il servizio back-end considera attendibile il servizio di facciata per autenticare il chiamante prima di inoltrargli la richiesta.This is because the backend service trusts the façade service to authenticate the caller before forwarding the request to it. Poiché il servizio di facciata si autentica con il servizio back-end, il servizio back-end può considerare le informazioni contenute nella richiesta inoltrata attendibili.Because the façade service authenticates itself to the backend service, the backend service can trust the information contained in the forwarded request.

Di seguito è riportata la configurazione di associazione per questo percorso di comunicazione.The following is the binding configuration for this communication path.

<bindings>  
  <customBinding>  
    <binding name="ClientBinding">  
      <security authenticationMode="UserNameOverTransport"/>  
      <windowsStreamSecurity/>  
      <tcpTransport/>  
    </binding>  
  </customBinding>  
</bindings>  

Il <sicurezza > elemento di associazione si occupa della trasmissione di nome utente e l'estrazione del chiamante iniziale.The <security> binding element takes care of the initial caller's username transmission and extraction. Il <windowsStreamSecurity > e <tcpTransport > con attenzione l'autenticazione di servizi back-end e di facciata e protezione dei messaggi.The <windowsStreamSecurity> and <tcpTransport> take care of authenticating façade and backend services and message protection.

Per inoltrare la richiesta, l'implementazione del servizio di facciata deve fornire nome utente del chiamante iniziale, in modo che infrastruttura di sicurezza WCF possa posizionarlo nel messaggio inoltrato.To forward the request, the façade service implementation must provide the initial caller's username so that WCF security infrastructure can place this into the forwarded message. Il nome utente del chiamante iniziale viene fornito nell'implementazione del servizio di facciata impostandolo nella proprietà ClientCredentials sull'istanza del proxy client che il servizio di facciata usa per comunicare con il servizio back-end.The initial caller's username is provided in the façade service implementation by setting it in the ClientCredentials property on the client proxy instance that façade service uses to communicate with the backend service.

Nel codice seguente viene illustrata l'implementazione del metodo GetCallerIdentity nel servizio di facciata.The following code shows how GetCallerIdentity method is implemented on the façade service. Gli altri metodi usano lo stesso modello.Other methods use the same pattern.

public string GetCallerIdentity()  
{  
    CalculatorClient client = new CalculatorClient();  
    client.ClientCredentials.UserName.UserName = ServiceSecurityContext.Current.PrimaryIdentity.Name;  
    string result = client.GetCallerIdentity();  
    client.Close();  
    return result;  
}  

Come illustrato nel codice precedente, la password non viene impostata nella proprietà ClientCredentials . Viene impostato solo il nome utente.As shown in the previous code, the password is not set on the ClientCredentials property, only the username is set. Infrastruttura di sicurezza WCF crea un token di sicurezza nome utente senza una password in questo caso, che è esattamente quello che richiede questo scenario.WCF security infrastructure creates a username security token without a password in this case, which is exactly what is required in this scenario.

Nel servizio back-end, le informazioni contenute nel token di sicurezza del nome utente devono essere autenticate.On the backend service, the information contained in the username security token must be authenticated. Per impostazione predefinita, sicurezza WCF tenta di eseguire il mapping all'utente a un account di Windows tramite la password specificata.By default, WCF security attempts to map the user to a Windows account using the provided password. In questo caso non è stata fornita una password e non è necessario che il servizio back-end autentichi il nome utente, visto che l'autenticazione è già stata eseguita dal servizio di facciata.In this case, there is no password provided and the backend service is not required to authenticate the username because the authentication was already performed by the façade service. Per implementare questa funzionalità in un oggetto personalizzato WCF UserNamePasswordValidator viene specificato che impone solo che un nome utente specificato nel token e non esegue altre autenticazioni.To implement this functionality in WCF, a custom UserNamePasswordValidator is provided that only enforces that a username is specified in the token and does not perform any additional authentication.

public class MyUserNamePasswordValidator : UserNamePasswordValidator  
{  
    public override void Validate(string userName, string password)  
    {  
        // Ignore the password because it is empty,   
        // we trust the facade service to authenticate the client.  
        // Accept the username information here so that the   
        // application gets access to it.  
        if (null == userName)  
        {  
            Console.WriteLine("Invalid username");  
            throw new   
             SecurityTokenValidationException("Invalid username");  
        }  
    }  
}  

Il validator personalizzato viene configurato per essere usato nel comportamento serviceCredentials nel file di configurazione del servizio di facciata.The custom validator is configured to be used inside the serviceCredentials behavior in the façade service configuration file.

<behaviors>  
  <serviceBehaviors>  
    <behavior name="BackendServiceBehavior">  
      <serviceCredentials>  
        <userNameAuthentication userNamePasswordValidationMode="Custom"  
           customUserNamePasswordValidatorType=  
          "Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator,   
           BackendService"/>  
      </serviceCredentials>  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  

Per estrarre le informazioni relative al nome utente e all'account del servizio di facciata attendibile, l'implementazione del servizio back-end usa la classe ServiceSecurityContext .To extract the username information and information about the trusted façade service account, the backend service implementation uses the ServiceSecurityContext class. Nel codice seguente viene illustrato come implementare il metodo GetCallerIdentity .The following code shows how the GetCallerIdentity method is implemented.

public string GetCallerIdentity()  
{  
    // Facade service is authenticated using Windows authentication.  
    //Its identity is accessible.  
    // On ServiceSecurityContext.Current.WindowsIdentity.  
    string facadeServiceIdentityName =   
          ServiceSecurityContext.Current.WindowsIdentity.Name;  

    // The client name is transmitted using Username authentication on   
    //the message level without the password  
    // using a supporting encrypted UserNameToken.  
    // Claims extracted from this supporting token are available in   
    // ServiceSecurityContext.Current.AuthorizationContext.ClaimSets   
    // collection.  
    string clientName = null;  
    foreach (ClaimSet claimSet in   
        ServiceSecurityContext.Current.AuthorizationContext.ClaimSets)  
    {  
        foreach (Claim claim in claimSet)  
        {  
            if (claim.ClaimType == ClaimTypes.Name &&   
                                   claim.Right == Rights.Identity)  
            {  
                clientName = (string)claim.Resource;  
                break;  
            }  
        }  
    }  
    if (clientName == null)  
    {  
        // In case there was no UserNameToken attached to the request.  
        // In the real world implementation the service should reject   
        // this request.  
        return "Anonymous caller via " + facadeServiceIdentityName;  
    }  

    return clientName + " via " + facadeServiceIdentityName;  
}  

Le informazioni relative all'account del servizio di facciata vengono estratte usando la proprietà ServiceSecurityContext.Current.WindowsIdentity .The façade service account information is extracted using the ServiceSecurityContext.Current.WindowsIdentity property. Per accedere alle informazioni relative al chiamante iniziale, il servizio back-end usa la proprietà ServiceSecurityContext.Current.AuthorizationContext.ClaimSets .To access the information about the initial caller the backend service uses the ServiceSecurityContext.Current.AuthorizationContext.ClaimSets property. Cerca un'attestazione di Identity di tipo Name.It looks for an Identity claim with a type Name. Questa attestazione viene generata automaticamente dall'infrastruttura di sicurezza WCF dalle informazioni contenute nel Username token di sicurezza.This claim is automatically generated by WCF security infrastructure from the information contained in the Username security token.

Esecuzione dell'esempioRunning the sample

Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client.When you run the sample, the operation requests and responses are displayed in the client console window. Premere INVIO nella finestra del client per arrestare il client.Press ENTER in the client window to shut down the client. È possibile premere INVIO nelle finestre della console del servizio di facciata e del servizio back-end per arrestare i servizi.You can press ENTER in the façade and backend service console windows to shut down the services.

Username authentication required.  
Provide a valid machine or domain ac  
   Enter username:  
user  
   Enter password:  
****  
user via MyMachine\testaccount  
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 file batch Setup.bat incluso nell'esempio relativo allo scenario della Facciata attendibile consente di configurare il server con un certificato attinente per eseguire il servizio di facciata che richiede sicurezza server basata su certificato per autenticarsi sul client.The Setup.bat batch file included with the Trusted Facade scenario sample enables you to configure the server with a relevant certificate to run the façade service that requires certificate-based security to authenticate itself to the client. Per altre informazioni, vedere la procedura di configurazione alla fine di questo argomento.See the setup procedure at the end of this topic for details.

Di seguito viene presentata una breve panoramica delle diverse sezioni dei file batch.The following provides a brief overview of the different sections of the batch files.

  • Creazione del certificato server.Creating the server certificate.

    Le righe seguenti del file batch Setup.bat creano il certificato server da usare.The following lines from the Setup.bat batch file create the server certificate to be used.

    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  
    

    La variabile %SERVER_NAME% specifica il nome del server. Il valore predefinito è localhost.The %SERVER_NAME% variable specifies the server name - the default value is localhost. Il certificato viene archiviato nell'archivio LocalMachine.The certificate is stored in the LocalMachine store.

  • Installazione del servizio di facciata nell'archivio certificati attendibili del client.Installing the façade service's certificate into the client's trusted certificate store.

    La riga seguente copia il servizio di facciata nell'archivio Persone attendibili del client.The following line copies the façade service's certificate into the client trusted people store. Questo passaggio è necessario perché certificati generati da Makecert.exe non sono considerati implicitamente attendibili dal sistema client.This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. Se è già disponibile un certificato impostato come radice in un certificato radice client attendibile, ad esempio un certificato rilasciato da Microsoft, il popolamento dell'archivio certificati client con il certificato server non è necessario.If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft-issued certificate—this step of populating the client certificate store with the server certificate is not required.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople  
    

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.

Per eseguire l'esempio sullo stesso computerTo run the sample on the same machine

  1. Assicurarsi che il percorso includa la cartella in cui è situato Makecert.exe.Ensure that the path includes the folder where Makecert.exe is located.

  2. Eseguire Setup.bat dalla cartella di installazione dell'esempio.Run Setup.bat from the sample install folder. In questo modo vengono installati tutti i certificati necessari per l'esecuzione dell'esempio.This installs all the certificates required for running the sample.

  3. Avviare BackendService.exe dalla directory \BackendService\bin in una finestra della console separataLaunch the BackendService.exe from \BackendService\bin directory in a separate console window

  4. Avviare FacadeService.exe dalla directory \FacadeService\bin in una finestra della console separataLaunch the FacadeService.exe from \FacadeService\bin directory in a separate console window

  5. Avviare Client.exe da \client\bin.Launch Client.exe from \client\bin. L'attività del client viene visualizzata nella finestra dell'applicazione console.Client activity is displayed on the client console application.

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

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

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Scenario\TrustedFacade

Vedere ancheSee Also