Freigeben über


Beispiel für Dienstidentität

In diesem Dienstidentitätsbeispiel wird veranschaulicht, wie die Identität für einen Dienst festgelegt wird. Zur Entwurfszeit kann ein Client die Identität mithilfe der Metadaten des Diensts abrufen und dann zur Laufzeit kann der Client die Identität des Diensts authentifizieren. Das Konzept der Dienstidentität besteht darin, einem Client zu ermöglichen, einen Dienst zu authentifizieren, bevor er einen seiner Vorgänge aufruft, wodurch der Client vor nicht authentifizierten Aufrufen geschützt wird. Bei einer sicheren Verbindung authentifiziert der Dienst auch die Anmeldeinformationen eines Clients, bevor er den Zugriff zulässt, aber dies ist nicht der Fokus dieses Beispiels. Sehen Sie sich die Beispiele in Client an, in denen die Serverauthentifizierung angezeigt wird.

Hinweis

Die Einrichtungsverfahren und Build-Anweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

In diesem Beispiel werden die folgenden Features veranschaulicht:

  • Festlegen der verschiedenen Identitätstypen auf verschiedenen Endpunkten für einen Dienst Jeder Identitätstyp verfügt über unterschiedliche Funktionen. Der Typ der zu verwendenden Identität hängt vom Typ der Sicherheitsanmeldeinformationen ab, die für die Bindung des Endpunkts verwendet werden.

  • Die Identität kann entweder deklarativ in der Konfiguration oder im Imperativen im Code festgelegt werden. In der Regel sollten Sie sowohl für den Client als auch für den Dienst die Konfiguration verwenden, um die Identität festzulegen.

  • Festlegen einer benutzerdefinierten Identität auf dem Client Eine benutzerdefinierte Identität ist in der Regel eine Anpassung eines vorhandenen Identitätstyps, mit dem der Client andere Anspruchsinformationen untersuchen kann, die in den Anmeldeinformationen des Diensts bereitgestellt werden, um Autorisierungsentscheidungen vor dem Aufrufen des Diensts zu treffen.

    Hinweis

    In diesem Beispiel wird die Identität eines bestimmten Zertifikats überprüft, das als identity.com bezeichnet wird, und der RSA-Schlüssel, der in diesem Zertifikat enthalten ist. Wenn Sie die Zertifikat- und RSA-Identitätstypen in der Konfiguration auf dem Client verwenden, können Sie diese Werte auf einfache Weise abrufen, indem Sie die WSDL für den Dienst überprüfen, in dem diese Werte serialisiert werden.

Im folgenden Beispielcode wird gezeigt, wie Die Identität eines Dienstendpunkts mit dem DNS (Domain Name Server) eines Zertifikats mithilfe eines WSHttpBinding konfiguriert wird.

//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;

Die Identität kann auch in der Konfiguration in der datei App.config angegeben werden. Das folgende Beispiel zeigt, wie Die UPN-Identität (Benutzerprinzipalname) für einen Dienstendpunkt festgelegt wird.

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

Eine benutzerdefinierte Identität kann auf dem Client festgelegt werden, indem sie von der EndpointIdentity- und der IdentityVerifier-Klasse abgeleitet wird. Konzeptionell kann die IdentityVerifier Klasse als Clientäquivalent der Dienstklasse AuthorizationManager betrachtet werden. Im folgenden Codebeispiel wird eine Implementierung von OrgEndpointIdentity veranschaulicht. Hier wird der Name einer Organisation gespeichert, der mit dem Antragstellernamen des Serverzertifikats verglichen wird. Die Autorisierungsprüfung für den Organisationsnamen erfolgt in der CheckAccess Methode für die CustomIdentityVerifier Klasse.

// 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;
    }
}

In diesem Beispiel wird ein Zertifikat namens identity.com verwendet, das sich im sprachspezifischen Identitätslösungsordner befindet.

So können Sie das Beispiel einrichten, erstellen und ausführen

  1. Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.

  2. Um die C#- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.

  3. Führen Sie das Beispiel in einer Einzel- oder computerübergreifenden Konfiguration aus, indem Sie die Anweisungen unter Ausführen der Windows Communication Foundation-Beispiele befolgen.

So führen Sie das Beispiel auf demselben Computer aus

  1. Importieren Sie unter Windows XP oder Windows Vista die Zertifikatdatei "Identity.pfx" im Ordner "Identitätslösung" in den Zertifikatspeicher "LocalMachine/My(Personal)" mithilfe des MMC-Snap-In-Tools. Diese Datei ist kennwortgeschützt. Während des Imports werden Sie nach einem Kennwort gefragt. Geben Sie xyz in das Kennwortfeld ein. Weitere Informationen finden Sie im Thema "How to: View Certificates with the MMC Snap-in ". Führen Sie anschließend Setup.bat in einer Entwickler-Eingabeaufforderung für Visual Studio mit Administratorrechten aus, die dieses Zertifikat zur Verwendung auf dem Client in den Speicher "CurrentUser/Trusted People" kopiert.

  2. Führen Sie unter Windows Server 2003 Setup.bat aus dem Beispielinstallationsordner in einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus. Dadurch werden alle Zertifikate installiert, die für die Ausführung des Beispiels erforderlich sind.

    Hinweis

    Die Setup.bat Batchdatei ist so konzipiert, dass sie über eine Visual Studio-Eingabeaufforderung ausgeführt werden kann. Die PATH-Umgebungsvariable, die in der Visual Studio-Eingabeaufforderung festgelegt ist, verweist auf das Verzeichnis, das ausführbare Dateien enthält, die vom skript Setup.bat benötigt werden. Stellen Sie sicher, dass Sie die Zertifikate entfernen, indem Sie Cleanup.bat ausführen, wenn Sie mit dem Beispiel fertig sind. Andere Sicherheitsbeispiele verwenden dieselben Zertifikate.

  3. Starten Sie Service.exe aus dem Verzeichnis \service\bin. Stellen Sie sicher, dass der Dienst bereit ist, und zeigt eine Aufforderung zum Drücken <der EINGABETASTE> an, um den Dienst zu beenden.

  4. Starten Sie Client.exe aus dem Verzeichnis "\client\bin" oder drücken Sie F5 in Visual Studio, um zu erstellen und auszuführen. Clientaktivität wird in der Clientkonsolenanwendung angezeigt.

  5. Wenn der Client und der Dienst nicht kommunizieren können, schauen Sie sich Tipps zur Problembehandlung für WCF-Samplesan.

So führen Sie das Beispiel computerübergreifend aus

  1. Bevor Sie die Clientseite des Beispiels erstellen, müssen Sie den Wert der Dienstendpunktadresse in der Datei Client.cs in der CallServiceCustomClientIdentity-Methode ändern. Erstellen Sie dann das Beispiel.

  2. Erstellen Sie ein Verzeichnis auf dem Dienstcomputer.

  3. Kopieren Sie die Dienstprogrammdateien von "service\bin" in das Verzeichnis auf dem Dienstcomputer. Kopieren Sie auch die dateien Setup.bat und Cleanup.bat auf den Dienstcomputer.

  4. Erstellen Sie ein Verzeichnis auf dem Clientcomputer für die Client-Binärdateien.

  5. Kopieren Sie die Clientprogrammdateien in das Clientverzeichnis auf dem Clientcomputer. Kopieren Sie außerdem die Dateien Setup.bat, Cleanup.batund ImportServiceCert.bat auf den Client.

  6. Führen Sie setup.bat service auf dem Dienst in einer Entwickler-Eingabeaufforderung für Visual Studio aus, die mit Administratorrechten geöffnet wurde. Wenn setup.bat mit dem Argument service ausgeführt wird, wird ein Dienstzertifikat mit dem vollqualifizierten Domänennamen des Computers erstellt und das Dienstzertifikat in eine Datei namens Service.cer exportiert.

  7. Kopieren Sie die datei Service.cer aus dem Dienstverzeichnis in das Clientverzeichnis auf dem Clientcomputer.

  8. Ändern Sie in der datei Client.exe.config auf dem Clientcomputer den Adresswert des Endpunkts so, dass er mit der neuen Adresse Ihres Diensts übereinstimmt. Es gibt mehrere Instanzen, die geändert werden müssen.

  9. Führen Sie auf dem Client ImportServiceCert.bat in einer Entwickler-Eingabeaufforderung für Visual Studio aus, die mit Administratorrechten geöffnet wurde. Dadurch wird das Dienstzertifikat aus der Service.cer-Datei in den Speicher CurrentUser - TrustedPeople importiert.

  10. Starten Sie auf dem Dienstcomputer Service.exe an einer Eingabeaufforderung.

  11. Starten Sie auf dem Clientcomputer Client.exe an einer Eingabeaufforderung. Wenn der Client und der Dienst nicht kommunizieren können, schauen Sie sich Tipps zur Problembehandlung für WCF-Samplesan.

So stellen Sie den Zustand vor Ausführung des Beispiels wieder her

  • Führen Sie Cleanup.bat im Beispielordner aus, nachdem Sie die Ausführung des Beispiels abgeschlossen haben.

    Hinweis

    Dieses Skript entfernt keine Dienstzertifikate auf einem Client, wenn dieses Beispiel auf computernübergreifend ausgeführt wird. Wenn Sie Beispiele für Windows Communication Foundation (WCF) ausgeführt haben, die Zertifikate auf mehreren Computern verwenden, sollten Sie die Dienstzertifikate löschen, die im CurrentUser-TrustedPeople-Speicher installiert wurden. 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.