Vertrauenswürdiger FassadendienstTrusted Facade Service

Dieses Szenariobeispiel veranschaulicht, wie Informationen Identität des Aufrufers von einem Dienst an einen anderen mithilfe von Windows Communication Foundation (WCF) ausgetauscht Sicherheitstokendienst-Infrastruktur.This scenario sample demonstrates how to flow caller's identity information from one service to another using Windows Communication Foundation (WCF) security infrastructure.

Ein allgemeines Entwurfsmuster besteht darin, dem öffentlichen Netzwerk die Funktionalität, die von einem Dienst bereitgestellt wird, mithilfe eines Fassadendiensts verfügbar zu machen.It is a common design pattern to expose the functionality provided by a service to the public network using a façade service. Der Fassadendienst befindet sich üblicherweise im Perimeternetzwerk (auch bekannt als DMZ (Demilitarized Zone; deutsch: entmilitarisierte Zone) und geschirmtes Unternetz) und kommuniziert mit einem Back-End-Dienst, der die Geschäftslogik implementiert und Zugriff auf interne Daten hat.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. Der Kommunikationskanal zwischen dem Fassadendienst und dem Back-End-Dienst führt durch eine Firewall und wird üblicherweise auf einen Zweck begrenzt.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.

Dieses Beispiel besteht aus den folgenden Komponenten:This sample consists of the following components:

  • RechnerclientCalculator client

  • RechnerfassadendienstCalculator façade service

  • Rechner-Back-End-DienstCalculator backend service

Der Fassadendienst ist für die Überprüfung der Anforderung und die Authentifizierung des Aufrufers verantwortlich.The façade service is responsible for validating the request and authenticating the caller. Nach erfolgreicher Authentifizierung und Validierung leitet er die Anforderung an den Back-End-Dienst mithilfe des gesteuerten Kommunikationskanals vom Perimeternetzwerk zum internen Netzwerk weiter.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. Als Teil der weitergeleiteten Anforderung beinhaltet der Fassadendienst Informationen über die Identität des Aufrufers. So kann der Back-End-Dienst diese Informationen in der Verarbeitung verwenden.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. Die Identität des Aufrufers wird mit einem Username -Sicherheitstoken im Nachrichten- Security -Header gesendet.The caller's identity is transmitted using a Username security token inside the message Security header. Das Beispiel verwendet der WCF-Sicherheitstokendienst-Infrastruktur zu übertragen, und extrahieren diese Informationen aus der Security Header.The sample uses the WCF security infrastructure to transmit and extract this information from the Security header.

Wichtig

Der Back-End-Dienst vertraut darauf, dass der Fassadendienst den Aufrufer authentifiziert.The backend service trusts the façade service to authenticate the caller. Daher authentifiziert der Back-End-Dienst den Aufrufer nicht erneut, sondern nutzt die Identitätsinformationen, die vom Fassadendienst in der weitergeleiteten Anforderung bereitgestellt werden.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. Aufgrund dieser Vertrauensbeziehung muss der Back-End-Dienst den Fassadendienst authentifizieren, um sicherzustellen, dass die weitergeleitete Nachricht von einer vertrauenswürdigen Quelle stammt, in diesem Fall vom Fassadendienst.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.

ImplementierungImplementation

Es gibt zwei Kommunikationspfade in diesem Beispiel.There are two communication paths in this sample. Der erste Kommunikationspfad besteht zwischen dem Client und dem Fassadendienst, der zweite zwischen dem Fassadendienst und dem Back-End-Dienst.First is between the client and the façade service, the second is between the façade service and the backend service.

Kommunikationspfad zwischen Client und FassadendienstCommunication Path between Client and Façade Service

Der Kommunikationspfad zwischen Client und Fassadendienst nutzt wsHttpBinding mit einem UserName -Clientanmeldeinformationstyp.The client to the façade service communication path uses wsHttpBinding with a UserName client credential type. Dies bedeutet, dass der Client Benutzername und Kennwort für die Authentifizierung zum Fassadendienst nutzt und der Fassadendienst die X.509-Zertifizierung für die Authentifizierung zum Client verwendet.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. Die Bindungskonfiguration sieht wie das folgende Beispiel aus.The binding configuration looks like the following example.

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

Der Fassadendienst authentifiziert den Aufrufer mithilfe benutzerdefinierter UserNamePasswordValidator -Implementierung.The façade service authenticates the caller using custom UserNamePasswordValidator implementation. Zu Demonstrationszwecken stellt die Authentifizierung nur sicher, dass der Benutzername des Aufrufers zum vorgelegten Kennwort passt.For demonstration purposes, the authentication only ensures that the caller's username matches the presented password. In realen Situationen wird der Benutzer wahrscheinlich mithilfe von Active Directory oder einem benutzerdefinierten ASP.NET-Mitgliedschaftsanbieter authentifiziert.In the real world situation, the user is probably authenticated using Active Directory or custom ASP.NET Membership provider. Die Implementierung des Validierungssteuerelements befindet sich in der Datei 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");  
        }  
    }  
}  

Das benutzerdefinierte Validierungssteuerelement ist so konfiguriert, dass es innerhalb des serviceCredentials -Verhaltens in der Konfigurationsdatei des Fassadendiensts verwendet wird.The custom validator is configured to be used inside the serviceCredentials behavior in the façade service configuration file. Dieses Verhalten wird darüber hinaus verwendet, um das X.509-Zertifikat des Diensts zu konfigurieren.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>  

Kommunikationspfad zwischen Fassadendienst und Back-End-DienstCommunication Path between Façade Service and Backend Service

Der Kommunikationspfad zwischen Fassadendienst und Back-End-Dienst nutzt die customBinding , die aus mehreren Bindungselementen besteht.The façade service to the backend service communication path uses a customBinding that consists of several binding elements. Diese Bindung erfüllt zwei Zwecke.This binding accomplishes two things. Sie authentifiziert den Fassadendienst und den Back-End-Dienst, um sicherzustellen, dass die Kommunikation sicher ist und aus einer vertrauenswürdigen Quelle stammt.It authenticates the façade service and backend service to ensure that the communication is secure and is coming from a trusted source. Darüber hinaus überträgt sie die Identität des ursprünglichen Aufrufers im Username -Sicherheitstoken.Additionally, it also transmits the initial caller's identity inside the Username security token. In diesem Fall wird nur der Benutzername des ursprünglichen Aufrufers zum Back-End-Dienst übertragen. Das Kennwort ist in der Nachricht nicht enthalten.In this case, only the initial caller's username is transmitted to the backend service, the password is not included in the message. Grund hierfür ist, dass der Back-End-Dienst dem Fassadendienst die Authentifizierung des Aufrufers anvertraut, bevor die Anforderung weitergeleitet wird.This is because the backend service trusts the façade service to authenticate the caller before forwarding the request to it. Da der Fassadendienst sich selbst gegenüber dem Back-End-Dienst authentifiziert, kann der Back-End-Dienst die in der weitergeleiteten Anforderung enthaltenen Informationen als vertrauenswürdig einstufen.Because the façade service authenticates itself to the backend service, the backend service can trust the information contained in the forwarded request.

Im Folgenden ist die Bindungskonfiguration für diesen Kommunikationspfad dargestellt.The following is the binding configuration for this communication path.

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

Die <Sicherheit > -Bindungselement übernimmt der Username-Übertragung und Extraktion des ursprünglichen Aufrufers.The <security> binding element takes care of the initial caller's username transmission and extraction. Die <WindowsStreamSecurity > und <TcpTransport > Authentifizierung von Fassaden- und Back-End-Dienste sowie den Nachrichtenschutz.The <windowsStreamSecurity> and <tcpTransport> take care of authenticating façade and backend services and message protection.

Um die Anforderung weiterzuleiten, muss die fassadendienstimplementierung Benutzername des ursprünglichen Aufrufers bereitstellen, damit diese WCF-Sicherheitsinfrastruktur dies in der weitergeleiteten Nachricht platziert werden kann.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. Der Benutzername des ursprünglichen Aufrufers wird in der Fassadendienstimplementierung bereitgestellt, indem er in der ClientCredentials -Eigenschaft auf der Clientproxyinstanz festgelegt wird, die der Fassadendienst für die Kommunikation mit dem Back-End-Dienst nutzt.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.

Der folgende Code zeigt, wie die GetCallerIdentity -Methode auf dem Fassadendienst implementiert wird.The following code shows how GetCallerIdentity method is implemented on the façade service. Andere Methoden verwenden das gleiche Muster.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;  
}  

Wie bereits im vorherigen Code gezeigt, ist das Kennwort nicht für die ClientCredentials -Eigenschaft festgelegt, sondern nur der Benutzername.As shown in the previous code, the password is not set on the ClientCredentials property, only the username is set. WCF-Sicherheitstokendienst-Infrastruktur erstellt ein Benutzernamen-Sicherheitstoken ohne Kennwort in diesem Fall das ist genau das, was in diesem Szenario erforderlich ist.WCF security infrastructure creates a username security token without a password in this case, which is exactly what is required in this scenario.

Auf dem Back-End-Dienst müssen die Informationen authentifiziert werden, die im Benutzernamen-Sicherheitstoken enthalten sind.On the backend service, the information contained in the username security token must be authenticated. Standardmäßig versucht WCF-Sicherheit, die Benutzer mit dem bereitgestellten Kennwort einem Windows-Konto zuzuordnen.By default, WCF security attempts to map the user to a Windows account using the provided password. In diesem Fall ist kein Kennwort angegeben, und der Back-End-Dienst muss den Benutzernamen nicht authentifizieren, da die Authentifizierung bereits vom Fassadendienst durchgeführt wurde.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. Implementieren Sie diese Funktionalität in WCF, ein benutzerdefiniertes UserNamePasswordValidator wird bereitgestellt, das nur durchsetzt, dass ein Benutzername im Token angegeben ist, und keine zusätzlichen Authentifizierung führt.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");  
        }  
    }  
}  

Das benutzerdefinierte Validierungssteuerelement ist so konfiguriert, dass es innerhalb des serviceCredentials -Verhaltens in der Konfigurationsdatei des Fassadendiensts verwendet wird.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>  

Zur Extraktion der Benutzernameninformationen und der Informationen über das vertrauenswürdige Fassadendienstkonto nutzt die Back-End-Dienst-Implementierung die ServiceSecurityContext -Klasse.To extract the username information and information about the trusted façade service account, the backend service implementation uses the ServiceSecurityContext class. Im folgenden Codebeispiel wird die Implementierung der GetCallerIdentity -Methode veranschaulicht.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;  
}  

Die Informationen über das Fassadendienstkonto werden mithilfe der ServiceSecurityContext.Current.WindowsIdentity -Eigenschaft extrahiert.The façade service account information is extracted using the ServiceSecurityContext.Current.WindowsIdentity property. Um auf die Informationen über den ursprünglichen Aufrufer zuzugreifen, verwendet der Back-End-Dienst die ServiceSecurityContext.Current.AuthorizationContext.ClaimSets -Eigenschaft.To access the information about the initial caller the backend service uses the ServiceSecurityContext.Current.AuthorizationContext.ClaimSets property. Hier wird nach einem Identity -Anspruch mit dem Typ Namegesucht.It looks for an Identity claim with a type Name. Dieser Anspruch wird automatisch generiert, von WCF-Sicherheitstokendienst-Infrastruktur aus der Informationen in den Username Sicherheitstoken.This claim is automatically generated by WCF security infrastructure from the information contained in the Username security token.

Ausführen des BeispielsRunning the sample

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Clientkonsolenfenster angezeigt.When you run the sample, the operation requests and responses are displayed in the client console window. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client. Sie können die EINGABETASTE in den Konsolenfenstern des Fassaden- und Back-End-Diensts drücken, um die Dienste zu schließen.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.  

Die im Beispiel zu Szenarios mit vertrauenswürdigen Fassaden enthaltene Batchdatei "Setup.bat" ermöglicht es Ihnen, den Server mit einem relevanten Zertifikat zu konfigurieren, damit der Fassadendienst ausgeführt wird, der zertifikatbasierte Sicherheit für die eigene Authentifizierung gegenüber dem Client erfordert.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. Weitere Informationen finden Sie in der Setupprozedur am Ende dieses Themas.See the setup procedure at the end of this topic for details.

Im Folgenden wird eine kurze Übersicht über die verschiedenen Abschnitte der Batchdateien bereitgestellt.The following provides a brief overview of the different sections of the batch files.

  • Erstellen des Serverzertifikats.Creating the server certificate.

    Mit den folgenden Zeilen aus der Batchdatei "Setup.bat" wird das zu verwendende Serverzertifikat erstellt.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  
    

    Die %SERVER_NAME% -Variable gibt den Servernamen an – der Standardwert ist "localhost".The %SERVER_NAME% variable specifies the server name - the default value is localhost. Das Zertifikat wird im LocalMachine-Speicher gespeichert.The certificate is stored in the LocalMachine store.

  • Installieren des Fassadendienstzertifikats im Speicher für vertrauenswürdige Zertifikate des Clients.Installing the façade service's certificate into the client's trusted certificate store.

    Die folgenden Zeilen kopieren das Fassadendienstzertifikat in den Clientspeicher für vertrauenswürdige Personen.The following line copies the façade service's certificate into the client trusted people store. Dieser Schritt ist erforderlich, da von "Makecert.exe" generierte Zertifikate nicht implizit vom Clientsystem als vertrauenswürdig eingestuft werden.This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. Wenn Sie bereits über ein Zertifikat verfügen, das von einem vertrauenswürdigen Clientstammzertifikat stammt (z. B. ein von Microsoft ausgegebenes Zertifikat), ist dieser Schritt zum Füllen des Clientzertifikatspeichers mit dem Serverzertifikat nicht erforderlich.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  
    

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

So führen Sie das Beispiel auf demselben Computer ausTo run the sample on the same machine

  1. Stellen Sie sicher, dass der Pfad den Ordner enthält, indem sich "Makecert.exe" befindet.Ensure that the path includes the folder where Makecert.exe is located.

  2. Führen Sie "Setup.bat" im Beispielinstallationsordner aus.Run Setup.bat from the sample install folder. Hiermit werden alle Zertifikate installiert, die zum Ausführen des Beispiels erforderlich sind.This installs all the certificates required for running the sample.

  3. Starten Sie "BackendService.exe" aus dem Verzeichnis "\BackendService\bin" in einem separaten KonsolenfensterLaunch the BackendService.exe from \BackendService\bin directory in a separate console window

  4. Starten Sie "FacadeService.exe" aus dem Verzeichnis "\FacadeService\bin" in einem separaten KonsolenfensterLaunch the FacadeService.exe from \FacadeService\bin directory in a separate console window

  5. Starten Sie Client.exe aus dem Ordner \client\bin.Launch Client.exe from \client\bin. In der Clientkonsolenanwendung wird Clientaktivität angezeigt.Client activity is displayed on the client console application.

  6. Wenn Client und Dienst nicht miteinander kommunizieren können, finden Sie unter Tipps zur Problembehandlung.If the client and service are not able to communicate, see Troubleshooting Tips.

So stellen Sie den Zustand vor Ausführung des Beispiels wieder herTo clean up after the sample

  1. Führen Sie Cleanup.bat im Beispielordner aus, nachdem Sie das Beispiel fertig ausgeführt haben.Run Cleanup.bat in the samples folder once you have finished running the sample.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.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. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

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

Siehe auchSee Also