AutorisierungsrichtlinieAuthorization Policy

Dieses Beispiel veranschaulicht, wie eine benutzerdefinierte Anspruchsautorisierungsrichtlinie und ein zugeordneter benutzerdefinierter Dienstautorisierungs-Manager implementiert werden.This sample demonstrates how to implement a custom claim authorization policy and an associated custom service authorization manager. Das ist nützlich, wenn der Dienst anspruchsbasierte Zugriffsüberprüfungen an Dienstvorgängen vornimmt und vor den Zugriffsüberprüfungen dem Aufrufer bestimmte Rechte gewährt.This is useful when the service makes claim-based access checks to service operations and prior to the access checks, grants the caller certain rights. Dieses Beispiel zeigt sowohl den Prozess zum Hinzufügen von Ansprüchen als auch den Prozess zum Durchführen einer Zugriffsüberprüfung anhand des finalisierten Satzes von Ansprüchen.This sample shows both the process of adding claims as well as the process for doing an access check against the finalized set of claims. Alle Anwendungsnachrichten zwischen dem Client und dem Server werden signiert und verschlüsselt.All application messages between the client and server are signed and encrypted. Standardmäßig werden mit der wsHttpBinding-Bindung ein vom Client angegebener Benutzername und ein Kennwort zum Anmelden an einem gültigen Windows NT-Konto verwendet.By default with the wsHttpBinding binding, a username and password supplied by the client are used to logon to a valid Windows NT account. In diesem Beispiel wird veranschaulicht, wie eine benutzerdefinierte System.IdentityModel.Selectors.UsernamePasswordValidator zum Authentifizieren des Clients.This sample demonstrates how to utilize a custom System.IdentityModel.Selectors.UsernamePasswordValidator to authenticate the client. Außerdem zeigt dieses Beispiel die Clientauthentifizierung beim Dienst mit einem X.509-Zertifikat.In addition this sample shows the client authenticating to the service using an X.509 certificate. Dieses Beispiel zeigt eine Implementierung von IAuthorizationPolicy und ServiceAuthorizationManager, das zwischen ihnen bestimmten Benutzern Zugriff auf bestimmte Methoden des Diensts gewährt.This sample shows an implementation of IAuthorizationPolicy and ServiceAuthorizationManager, which between them grant access to specific methods of the service for specific users. Dieses Beispiel basiert auf der Nachrichtensicherheit – Benutzername, jedoch wird veranschaulicht, wie Sie eine Transformation von Ansprüchen vor dem Ausführen der ServiceAuthorizationManager aufgerufen werden.This sample is based on the Message Security User Name, but demonstrates how to perform a claim transformation prior to the ServiceAuthorizationManager being called.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Insgesamt demonstriert dieses Beispiel Folgendes:In summary, this sample demonstrates how:

  • Der Client kann mit einem Benutzernamen und einem Kennwort authentifiziert werden.The client can be authenticated using a user name-password.

  • Der Client kann mit einem X.509-Zertifikat authentifiziert werden.The client can be authenticated using an X.509 certificate.

  • Der Server überprüft die Clientanmeldeinformationen mithilfe eines benutzerdefinierten UsernamePassword-Validierungssteuerelements.The server validates the client credentials against a custom UsernamePassword validator.

  • Der Server wird mit dem X.509-Zertifikat des Servers authentifiziert.The server is authenticated using the server's X.509 certificate.

  • Der Server kann ServiceAuthorizationManager verwenden, um den Zugriff auf bestimmte Methoden im Dienst zu steuern.The server can use ServiceAuthorizationManager to control access to certain methods in the service.

  • So wird IAuthorizationPolicy implementiert.How to implement IAuthorizationPolicy.

Der Dienst macht zwei Endpunkte zur Kommunikation mit dem Dienst verfügbar, die mit der Konfigurationsdatei "App.conf" definiert werden. Jeder Endpunkt besteht aus einer Adresse, einer Bindung und einem Vertrag.The service exposes two endpoints for communicating with the service, defined using the configuration file App.config. Each endpoint consists of an address, a binding, and a contract. Die eine Bindung wird mit einer normalen wsHttpBinding-Bindung konfiguriert, die WS-Security und Clientbenutzernamenauthentifizierung verwendet.One binding is configured with a standard wsHttpBinding binding that uses WS-Security and client username authentication. Die andere Bindung wird mit einer normalen wsHttpBinding-Bindung konfiguriert, die WS-Security und Clientzertifikatauthentifizierung verwendet.The other binding is configured with a standard wsHttpBinding binding that uses WS-Security and client certificate authentication. Die <Verhalten > gibt an, dass die Anmeldeinformationen des Benutzers für die Dienstauthentifizierung verwendet werden.The <behavior> specifies that the user credentials are to be used for service authentication. Das Serverzertifikat muss für den gleichen Wert enthalten die SubjectName -Eigenschaft der findValue Attribut in der <ServiceCertificate >.The server certificate must contain the same value for the SubjectName property as the findValue attribute in the <serviceCertificate>.

<system.serviceModel>  
  <services>  
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"  
             behaviorConfiguration="CalculatorServiceBehavior">  
      <host>  
        <baseAddresses>  
          <!-- configure base address provided by host -->  
          <add baseAddress ="http://localhost:8001/servicemodelsamples/service"/>  
        </baseAddresses>  
      </host>  
      <!-- use base address provided by host, provide two endpoints -->  
      <endpoint address="username"  
                binding="wsHttpBinding"  
                bindingConfiguration="Binding1"   
                contract="Microsoft.ServiceModel.Samples.ICalculator" />  
      <endpoint address="certificate"  
                binding="wsHttpBinding"  
                bindingConfiguration="Binding2"   
                contract="Microsoft.ServiceModel.Samples.ICalculator" />  
    </service>  
  </services>  

  <bindings>  
    <wsHttpBinding>  
      <!-- Username binding -->  
      <binding name="Binding1">  
        <security mode="Message">  
    <message clientCredentialType="UserName" />  
        </security>  
      </binding>  
      <!-- X509 certificate binding -->  
      <binding name="Binding2">  
        <security mode="Message">  
          <message clientCredentialType="Certificate" />  
        </security>  
      </binding>  
    </wsHttpBinding>  
  </bindings>  

  <behaviors>  
    <serviceBehaviors>  
      <behavior name="CalculatorServiceBehavior" >  
        <serviceDebug includeExceptionDetailInFaults ="true" />  
        <serviceCredentials>  
          <!--   
          The serviceCredentials behavior allows one to specify a custom validator for username/password combinations.    
          -->  
          <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.MyCustomUserNameValidator, service" />  
          <!--   
          The serviceCredentials behavior allows one to specify authentication constraints on client certificates.  
          -->  
          <clientCertificate>  
            <!--   
            Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate   
            is in the user's Trusted People store, then it will be trusted without performing a  
            validation of the certificate's issuer chain. This setting is used here for convenience so that the   
            sample can be run without having to have certificates issued by a certification authority (CA).  
            This setting is less secure than the default, ChainTrust. The security implications of this   
            setting should be carefully considered before using PeerOrChainTrust in production code.   
            -->  
            <authentication certificateValidationMode="PeerOrChainTrust" />  
          </clientCertificate>  
          <!--   
          The serviceCredentials behavior allows one 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.  
          -->  
          <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />  
        </serviceCredentials>  
        <serviceAuthorization serviceAuthorizationManagerType="Microsoft.ServiceModel.Samples.MyServiceAuthorizationManager, service">  
          <!--   
          The serviceAuthorization behavior allows one to specify custom authorization policies.  
          -->  
          <authorizationPolicies>  
            <add policyType="Microsoft.ServiceModel.Samples.CustomAuthorizationPolicy.MyAuthorizationPolicy, PolicyLibrary" />  
          </authorizationPolicies>  
        </serviceAuthorization>  
      </behavior>  
    </serviceBehaviors>  
  </behaviors>  

</system.serviceModel>  

Jede Clientendpunktkonfiguration besteht aus einem Konfigurationsnamen, einer absoluten Adresse für den Dienstendpunkt, der Bindung und dem Vertrag.Each client endpoint configuration consists of a configuration name, an absolute address for the service endpoint, the binding, and the contract. Die Clientbindung wird mit dem entsprechenden Sicherheitsmodus entsprechend den Angaben in diesem Fall in konfiguriert die <Sicherheit > und clientCredentialType nach den Angaben in der <Nachricht >.The client binding is configured with the appropriate security mode as specified in this case in the <security> and clientCredentialType as specified in the <message>.

<system.serviceModel>  

    <client>  
      <!-- Username based endpoint -->  
      <endpoint name="Username"  
            address="http://localhost:8001/servicemodelsamples/service/username"   
    binding="wsHttpBinding"   
    bindingConfiguration="Binding1"   
                behaviorConfiguration="ClientCertificateBehavior"  
                contract="Microsoft.ServiceModel.Samples.ICalculator" >  
      </endpoint>  
      <!-- X509 certificate based endpoint -->  
      <endpoint name="Certificate"  
                        address="http://localhost:8001/servicemodelsamples/service/certificate"   
                binding="wsHttpBinding"   
            bindingConfiguration="Binding2"   
                behaviorConfiguration="ClientCertificateBehavior"  
                contract="Microsoft.ServiceModel.Samples.ICalculator">  
      </endpoint>  
    </client>  

    <bindings>  
      <wsHttpBinding>  
        <!-- Username binding -->  
      <binding name="Binding1">  
        <security mode="Message">  
          <message clientCredentialType="UserName" />  
        </security>  
      </binding>  
        <!-- X509 certificate binding -->  
        <binding name="Binding2">  
          <security mode="Message">  
            <message clientCredentialType="Certificate" />  
          </security>  
        </binding>  
    </wsHttpBinding>  
    </bindings>  

    <behaviors>  
      <behavior name="ClientCertificateBehavior">  
        <clientCredentials>  
          <serviceCertificate>  
            <!--   
            Setting the certificateValidationMode to PeerOrChainTrust  
            means that if the certificate   
            is in the user's Trusted People store, then it will be   
            trusted without performing a  
            validation of the certificate's issuer chain. This setting   
            is used here for convenience so that the   
            sample can be run without having to have certificates   
            issued by a certification authority (CA).  
            This setting is less secure than the default, ChainTrust.   
            The security implications of this   
            setting should be carefully considered before using   
            PeerOrChainTrust in production code.   
            -->  
            <authentication certificateValidationMode = "PeerOrChainTrust" />  
          </serviceCertificate>  
        </clientCredentials>  
      </behavior>  
    </behaviors>  

  </system.serviceModel>  

Für den benutzernamenbasierten Endpunkt legt die Clientimplementierung den zu verwendenden Benutzernamen und das Kennwort fest.For the user name-based endpoint, the client implementation sets the user name and password to use.

// Create a client with Username endpoint configuration  
CalculatorClient client1 = new CalculatorClient("Username");  

client1.ClientCredentials.UserName.UserName = "test1";  
client1.ClientCredentials.UserName.Password = "1tset";  

try  
{  
    // Call the Add service operation.  
    double value1 = 100.00D;  
    double value2 = 15.99D;  
    double result = client1.Add(value1, value2);  
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  
    ...  
}  
catch (Exception e)  
{  
    Console.WriteLine("Call failed : {0}", e.Message);  
}  

client1.Close();  

Für den zertifikatbasierten Endpunkt legt die Clientimplementierung das zu verwendende Clientzertifikat fest.For the certificate-based endpoint, the client implementation sets the client certificate to use.

// Create a client with Certificate endpoint configuration  
CalculatorClient client2 = new CalculatorClient("Certificate");  

client2.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "test1");  

try  
{  
    // Call the Add service operation.  
    double value1 = 100.00D;  
    double value2 = 15.99D;  
    double result = client2.Add(value1, value2);  
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  
    ...  
}  
catch (Exception e)  
{  
    Console.WriteLine("Call failed : {0}", e.Message);  
}  

client2.Close();  

In diesem Beispiel wird ein benutzerdefinierter UserNamePasswordValidator verwendet, um Benutzernamen und Kennwörter zu überprüfen.This sample uses a custom UserNamePasswordValidator to validate user names and passwords. Das Beispiel implementiert MyCustomUserNamePasswordValidator, das von UserNamePasswordValidator abgeleitet ist.The sample implements MyCustomUserNamePasswordValidator, derived from UserNamePasswordValidator. Weitere Informationen zu UserNamePasswordValidator finden Sie in der Dokumentation.See the documentation about UserNamePasswordValidator for more information. Um die Integration mit dem UserNamePasswordValidator zu demonstrieren, implementiert dieses benutzerdefinierte Validierungssteuerelement-Beispiel die Validate-Methode zum Entgegennehmen von Kombinationen aus Benutzername und Kennwort, wobei der Benutzername wie im folgenden Code gezeigt mit dem Kennwort übereinstimmt.For the purposes of demonstrating the integration with the UserNamePasswordValidator, this custom validator sample implements the Validate method to accept user name/password pairs where the user name matches the password as shown in the following code.

public class MyCustomUserNamePasswordValidator : UserNamePasswordValidator  
{  
  // This method validates users. It allows in two users,   
  // test1 and test2 with passwords 1tset and 2tset respectively.  
  // This code is for illustration purposes only and   
  // MUST NOT be used in a production environment because it   
  // is NOT secure.      
  public override void Validate(string userName, string password)  
  {  
    if (null == userName || null == password)  
    {  
      throw new ArgumentNullException();  
    }  

    if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset"))  
    {  
      throw new SecurityTokenException("Unknown Username or Password");  
    }  
  }  
}  

Nachdem das Validierungssteuerelement im Dienstcode implementiert ist, muss der Diensthost über die zu verwendende Validierungssteuerelementinstanz informiert werden.Once the validator is implemented in service code, the service host must be informed about the validator instance to use. Dies wird mit dem folgenden Code durchgeführt.This is done using the following code.

Servicehost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;  
serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new MyCustomUserNamePasswordValidatorProvider();  

Sie können dasselbe aber auch in der Konfiguration vornehmen.Or you can do the same thing in configuration.

<behavior ...>  
    <serviceCredentials>  
      <!--   
      The serviceCredentials behavior allows one to specify a custom validator for username/password combinations.    
      -->  
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.MyCustomUserNameValidator, service" />  
    ...  
    </serviceCredentials>  
</behavior>  

Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) stellt ein umfangreiches anspruchsbasiertes Modell zum Durchführen von Zugriffsüberprüfungen bereit. provides a rich claims-based model for performing access checks. Das ServiceAuthorizationManager-Objekt wird verwendet, um die Zugriffsüberprüfung durchzuführen und zu bestimmen, ob die dem Client zugeordneten Ansprüche die Anforderungen erfüllen, die für den Zugriff auf die Dienstmethode erforderlich sind.The ServiceAuthorizationManager object is used to perform the access check and determine whether the claims associated with the client satisfy the requirements necessary to access the service method.

Zu Demonstrationszwecken zeigt dieses Beispiel eine Implementierung von ServiceAuthorizationManager, der die CheckAccessCore-Methode implementiert, um einem Benutzer den Zugriff auf Methoden zu erlauben. Dies erfolgt anhand von Ansprüchen des Typs http://example.com/claims/allowedoperation, deren Wert der Aktions-URI des Vorgangs ist, dessen Aufruf zugelassen werden soll.For the purposes of demonstration, this sample shows an implementation of ServiceAuthorizationManager that implements the CheckAccessCore method to allow a user's access to methods based on claims of type http://example.com/claims/allowedoperation whose value is the Action URI of the operation that is allowed to be called.

public class MyServiceAuthorizationManager : ServiceAuthorizationManager  
{  
  protected override bool CheckAccessCore(OperationContext operationContext)  
  {                  
    string action = operationContext.RequestContext.RequestMessage.Headers.Action;  
    Console.WriteLine("action: {0}", action);  
    foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)  
    {  
      if ( cs.Issuer == ClaimSet.System )  
      {  
        foreach (Claim c in cs.FindClaims("http://example.com/claims/allowedoperation", Rights.PossessProperty))  
        {  
          Console.WriteLine("resource: {0}", c.Resource.ToString());  
          if (action == c.Resource.ToString())  
            return true;  
        }  
      }  
    }  
    return false;                   
  }  
}  

Wenn der benutzerdefinierte ServiceAuthorizationManager implementiert ist, muss der Diensthost über den zu verwendenden ServiceAuthorizationManager informiert werden.Once the custom ServiceAuthorizationManager is implemented, the service host must be informed about the ServiceAuthorizationManager to use. Dies wird wie im folgenden Code gezeigt durchgeführt.This is done as shown in the following code.

<behavior ...>  
    ...  
    <serviceAuthorization serviceAuthorizationManagerType="Microsoft.ServiceModel.Samples.MyServiceAuthorizationManager, service">  
        ...  
    </serviceAuthorization>  
</behavior>  

Die primäre IAuthorizationPolicy-Methode, die implementiert werden soll, ist die Evaluate(EvaluationContext, Object)-Methode.The primary IAuthorizationPolicy method to implement is the Evaluate(EvaluationContext, Object) method.

public class MyAuthorizationPolicy : IAuthorizationPolicy  
{  
    string id;  

    public MyAuthorizationPolicy()  
    {  
    id =  Guid.NewGuid().ToString();  
    }  

    public bool Evaluate(EvaluationContext evaluationContext,   
                                            ref object state)  
    {  
        bool bRet = false;  
        CustomAuthState customstate = null;  

        if (state == null)  
        {  
            customstate = new CustomAuthState();  
            state = customstate;  
        }  
        else  
            customstate = (CustomAuthState)state;  
        Console.WriteLine("In Evaluate");  
        if (!customstate.ClaimsAdded)  
        {  
           IList<Claim> claims = new List<Claim>();  

           foreach (ClaimSet cs in evaluationContext.ClaimSets)  
              foreach (Claim c in cs.FindClaims(ClaimTypes.Name,   
                                         Rights.PossessProperty))  
                  foreach (string s in   
                        GetAllowedOpList(c.Resource.ToString()))  
                  {  
                       claims.Add(new  
               Claim("http://example.com/claims/allowedoperation",   
                                    s, Rights.PossessProperty));  
                            Console.WriteLine("Claim added {0}", s);  
                      }  
                   evaluationContext.AddClaimSet(this,   
                           new DefaultClaimSet(this.Issuer,claims));  
                   customstate.ClaimsAdded = true;  
                   bRet = true;  
                }  
         else  
         {  
              bRet = true;  
         }  
         return bRet;  
     }  
...  
}  

Der oben aufgeführte Code zeigt, wie die Evaluate(EvaluationContext, Object)-Methode prüft, dass keine neuen Ansprüche hinzugefügt wurden, die sich auf die Verarbeitung auswirken, und bestimmte Ansprüche hinzufügt.The previous code shows how the Evaluate(EvaluationContext, Object) method checks that no new claims have been added that affect the processing and adds specific claims. Die Ansprüche, die zulässig sind, werden aus der GetAllowedOpList-Methode abgerufen, die so implementiert ist, dass sie eine Liste der Vorgänge zurückgibt, die der Benutzer ausführen darf.The claims that are allowed are obtained from the GetAllowedOpList method, which is implemented to return a specific list of operations that the user is allowed to perform. Die Autorisierungsrichtlinie fügt Ansprüche zum Zugreifen auf den jeweiligen Vorgang hinzu.The authorization policy adds claims for accessing the particular operation. Dies wird später vom ServiceAuthorizationManager verwendet, um Zugriffsprüfungsentscheidungen auszuführen.This is later used by the ServiceAuthorizationManager to perform access check decisions.

Wenn der benutzerdefinierte IAuthorizationPolicy implementiert ist, muss der Diensthost über die zu verwendenden Autorisierungsrichtlinien informiert werden.Once the custom IAuthorizationPolicy is implemented, the service host must be informed about the authorization policies to use.

<serviceAuthorization ...>  
       <authorizationPolicies>   
            <add policyType='Microsoft.ServiceModel.Samples.CustomAuthorizationPolicy.MyAuthorizationPolicy, PolicyLibrary' />  
       </authorizationPolicies>   
</serviceAuthorization>  

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. Der Client ruft erfolgreich die Add-, Subtract- und Multiple-Methoden auf und erhält beim Versuch, die Divide-Methode aufzurufen, eine Nachricht vom Typ "Zugriff verweigert".The client successfully calls the Add, Subtract and Multiple methods and gets an "Access is denied" message when trying to call the Divide method. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client.

SetupbatchdateiSetup Batch File

Mit der in diesem Beispiel enthaltenen Batchdatei Setup.bat können Sie den Server mit relevanten Zertifikaten zum Ausführen einer selbst gehosteten Anwendung konfigurieren, die serverzertifikatbasierte Sicherheit erfordert.The Setup.bat batch file included with this sample allows you to configure the server with relevant certificates to run a self-hosted application that requires server certificate-based security.

Nachfolgend erhalten Sie einen kurzen Überblick über die verschiedenen Abschnitte der Batchdateien, damit Sie sie so ändern können, dass sie in der entsprechenden Konfiguration ausgeführt werden:The following provides a brief overview of the different sections of the batch files so that they can be modified to run in the appropriate configuration:

  • 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. Die Variable %SERVER_NAME% gibt den Servernamen an.The %SERVER_NAME% variable specifies the server name. Ändern Sie diese Variable, und geben Sie Ihren eigenen Servernamen an.Change this variable to specify your own server name. Der Standardwert ist localhost.The default value is localhost.

    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  
    
  • Installieren des Serverzertifikats in den Clientspeicher für vertrauenswürdige Zertifikate.Installing the server certificate into client's trusted certificate store.

    Mit den folgenden Zeilen in der Batchdatei Setup.bat wird das Serverzertifikat in den Clientspeicher für vertrauenswürdige Personen kopiert.The following lines in the Setup.bat batch file copy the server certificate into the client trusted people store. Dieser Schritt ist erforderlich, da von Makecert.exe generierten Zertifikaten nicht implizit vom Clientsystem vertraut wird.This step is required because certificates that are generated by Makecert.exe are not implicitly trusted by the client system. Wenn Sie bereits über ein Zertifikat verfügen, dass von einem vertrauenswürdigen Clientstammzertifikat abstammt (z. B. ein von Microsoft ausgegebenes Zertifikat), ist dieser Schritt zum Auffü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  
    
  • Erstellen des Clientzertifikats.Creating the client certificate.

    Die folgenden Zeilen aus der Batchdatei Setup.bat erstellen das zu verwendende Clientzertifikat.The following lines from the Setup.bat batch file create the client certificate to be used. Die Variable %USER_NAME% gibt den Servernamen an.The %USER_NAME% variable specifies the server name. Dieser Wert wird auf "test1" festgelegt, da dies der Name ist, nach dem die IAuthorizationPolicy sucht.This value is set to "test1" because this is the name the IAuthorizationPolicy looks for. Wenn Sie den Wert von % USER_NAME% ändern, müssen Sie in der IAuthorizationPolicy.Evaluate-Methode den entsprechenden Wert ändern.If you change the value of %USER_NAME% you must change the corresponding value in the IAuthorizationPolicy.Evaluate method.

    Das Zertifikat wird im persönlichen Speicher unterhalb von CurrentUser gespeichert.The certificate is stored in My (Personal) store under the CurrentUser store location.

    echo ************  
    echo making client cert  
    echo ************  
    makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe  
    
  • Installieren des Clientzertifikats in den Serverspeicher für vertrauenswürdige Zertifikate.Installing the client certificate into server's trusted certificate store.

    Die folgenden Zeilen in der Batchdatei Setup.bat kopieren das Clientzertifikat in den Speicher für vertrauenswürdige Personen.The following lines in the Setup.bat batch file copy the client certificate into the trusted people store. Dieser Schritt ist erforderlich, da von "Makecert.exe" generierten Zertifikaten nicht implizit vom Serversystem vertraut wird.This step is required because certificates that are generated by Makecert.exe are not implicitly trusted by the server system. Wenn Sie bereits über ein Zertifikat verfügen, das von einem vertrauenswürdigen Stammzertifikat abstammt (z. B. ein von Microsoft ausgegebenes Zertifikat), ist dieser Schritt zum Auffüllen des Serverzertifikatspeichers mit dem Clientzertifikat nicht erforderlich.If you already have a certificate that is rooted in a trusted root certificate—for example, a Microsoft issued certificate—this step of populating the server certificate store with the client certificate is not required.

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

So richten Sie das Beispiel ein und erstellen esTo set up and build the sample

  1. Führen Sie zum Erstellen der Projektmappe die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  2. Um das Beispiel in einer Konfiguration mit einem einzigen Computer oder computerübergreifend auszuführen, befolgen Sie die folgenden Anweisungen.To run the sample in a single- or cross-computer configuration, use the following instructions.

Hinweis

Wenn Sie zur Neugenerierung der Konfiguration für dieses Beispiel die Datei Svcutil.exe verwenden, müssen Sie den Endpunktnamen in der Clientkonfiguration so ändern, dass er mit dem Clientcode übereinstimmt.If you use Svcutil.exe to regenerate the configuration for this sample, be sure to modify the endpoint name in the client configuration to match the client code.

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

  1. Öffnen Sie eine Visual Studio 2012Visual Studio 2012-Eingabeaufforderung mit Administratorrechten, und führen Sie Setup.bat aus dem Beispielinstallationsordner aus.Open a Visual Studio 2012Visual Studio 2012 Command Prompt window with administrator privileges and 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.

    Hinweis

    Die Batchdatei Setup.bat ist darauf ausgelegt, an einer Visual Studio 2012Visual Studio 2012-Eingabeaufforderung ausgeführt zu werden.The Setup.bat batch file is designed to be run from a Visual Studio 2012Visual Studio 2012 Command Prompt. Die innerhalb der Visual Studio 2012Visual Studio 2012-Eingabeaufforderung festgelegte PATH-Umgebungsvariable zeigt auf das Verzeichnis mit den ausführbaren Dateien, die für das Skript Setup.bat erforderlich sind.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.

  2. Führen Sie Setup.bat aus dem Beispielinstallationsordner an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.Run Setup.bat in a Visual Studio command prompt opened with administrator privileges 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 Service.exe aus dem Ordner \service\bin.Launch Service.exe from service\bin.

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

  5. 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 führen Sie das Beispiel computerübergreifend ausTo run the sample across computers

  1. Erstellen Sie auf dem Dienstcomputer ein Verzeichnis.Create a directory on the service computer.

  2. Kopieren Sie die Dienstprogrammdateien aus \service\bin in das Verzeichnis auf dem Dienstcomputer.Copy the service program files from \service\bin to the directory on the service computer. Kopieren Sie außerdem die Dateien Setup.bat, Cleanup.bat, GetComputerName.vbs und ImportClientCert.bat auf den Dienstcomputer.Also copy the Setup.bat, Cleanup.bat, GetComputerName.vbs and ImportClientCert.bat files to the service computer.

  3. Erstellen Sie auf dem Clientcomputer ein Verzeichnis für die Clientbinärdateien.Create a directory on the client computerfor the client binaries.

  4. Kopieren Sie die Clientprogrammdateien in das Clientverzeichnis auf dem Clientcomputer.Copy the client program files to the client directory on the client computer. Kopieren Sie die Dateien Setup.bat, Cleanup.bat und ImportServiceCert.bat ebenfalls auf den Client.Also copy the Setup.bat, Cleanup.bat, and ImportServiceCert.bat files to the client.

  5. Führen Sie auf dem Server setup.bat service an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.On the server, run setup.bat service in a Visual Studio command prompt opened with administrator privileges. Ausführen setup.bat mit der service Argument erstellt ein Dienstzertifikat mit dem vollqualifizierten Domänennamen des Computers erstellt und Exporte das Dienstzertifikat in eine Datei "Service.cer" exportiert.Running setup.bat with the service argument creates a service certificate with the fully-qualified domain name of the computerand exports the service certificate to a file named Service.cer.

  6. Bearbeiten Service.exe.config, um den neuen Zertifikatnamen entspricht (in der findValue Attribut in der <ServiceCertificate >) die ist identisch mit den vollqualifizierten Domänennamen des Computers.Edit Service.exe.config to reflect the new certificate name (in the findValue attribute in the <serviceCertificate>) which is the same as the fully-qualified domain name of the computer. Ändern Sie auch den Computernamen im die <Service > /<BaseAddresses >-Element von "localhost" auf den vollqualifizierten Namen Ihres dienstcomputers.Also change the computername in the <service>/<baseAddresses> element from localhost to the fully-qualified name of your service computer.

  7. Kopieren Sie die Datei Service.cer aus dem Dienstverzeichnis in das Clientverzeichnis auf dem Clientcomputer.Copy the Service.cer file from the service directory to the client directory on the client computer.

  8. Führen Sie auf dem Client setup.bat client an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.On the client, run setup.bat client in a Visual Studio command prompt opened with administrator privileges. Ausführen setup.bat mit der client Argument wird ein Clientzertifikat mit dem Namen test1 erstellt und das Clientzertifikat in der Datei Client.cer exportiert.Running setup.bat with the client argument creates a client certificate named test1 and exports the client certificate to a file named Client.cer.

  9. Ändern Sie in der Datei Client.exe.config auf dem Clientcomputer den Wert für die Adresse des Endpunkts, sodass er mit der neuen Adresse Ihres Diensts übereinstimmt.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. Ersetzen Sie dazu localhost durch den vollqualifizierten Domänennamen des Servers.Do this by replacing localhost with the fully-qualified domain name of the server.

  10. Kopieren Sie die Datei Client.cer aus dem Clientverzeichnis in das Dienstverzeichnis auf dem Server.Copy the Client.cer file from the client directory to the service directory on the server.

  11. Führen Sie auf dem Client ImportServiceCert.bat an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.On the client, run ImportServiceCert.bat in a Visual Studio command prompt opened with administrator privileges. Dadurch wird das Dienstzertifikat aus der Datei Service.cer in den Speicher CurrentUser – TrustedPeople importiert.This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store.

  12. Führen Sie auf dem Server ImportClientCert.bat an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.On the server, run ImportClientCert.bat in a Visual Studio command prompt opened with administrator privileges. Dadurch wird das Clientzertifikat aus der Datei Client.cer in den Speicher LocalMachine – TrustedPeople importiert.This imports the client certificate from the Client.cer file into the LocalMachine - TrustedPeople store.

  13. Starten Sie auf dem Servercomputer Service.exe in einem Eingabeaufforderungsfenster.On the server computer, launch Service.exe from the command prompt window.

  14. Starten Sie auf dem Clientcomputer Client.exe in einem Eingabeaufforderungsfenster.On the client computer, launch Client.exe from a command prompt window. 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. Dadurch werden die Server- und Clientzertifikate aus dem Zertifikatspeicher entfernt.This removes the server and client certificates from the certificate store.

Hinweis

Wenn dieses Beispiel computerübergreifend ausgeführt wird, entfernt dieses Skript keine Dienstzertifikate auf einem Client.This script does not remove service certificates on a client when running this sample across computers. Wenn Sie WCFWCF-Beispiele ausgeführt haben, die Zertifikate computerübergreifend verwenden, müssen Sie die Dienstzertifikate entfernen, die im Speicher CurrentUser – TrustedPeople installiert wurden.If you have run WCFWCF samples that use certificates across computers, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. Verwenden Sie dazu den folgenden Befehl: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Beispiel: 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.

Siehe auchSee Also