Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
In diesem Beispiel wird veranschaulicht, wie ein benutzerdefinierter Tokenanbieter implementiert wird. Ein Tokenanbieter in Windows Communication Foundation (WCF) wird zum Bereitstellen von Anmeldeinformationen für die Sicherheitsinfrastruktur verwendet. Der Tokenanbieter untersucht im Allgemeinen das Ziel und gibt geeignete Anmeldeinformationen aus, damit die Sicherheitsinfrastruktur die Nachricht sichern kann. In WCF ist der standardmäßige Tokenanbieter des Anmeldeinformations-Managers enthalten. WCF wird auch mit einem CardSpace-Tokenanbieter ausgeliefert. Benutzerdefinierte Tokenanbieter sind in den folgenden Fällen nützlich:
Wenn Sie einen Speicher für Anmeldeinformationen verwenden, mit dem diese Tokenanbieter nicht umgehen können.
Wenn Sie Ihren eigenen benutzerdefinierten Mechanismus zum Transformieren der Anmeldeinformationen bereitstellen möchten, vom Zeitpunkt an, an dem der Benutzer die Details angibt, bis zu dem Punkt, an dem das WCF-Clientframework die Anmeldeinformationen verwendet.
Wenn Sie ein benutzerdefiniertes Token erstellen.
In diesem Beispiel wird gezeigt, wie Sie einen benutzerdefinierten Tokenanbieter erstellen, der die Eingabe vom Benutzer in ein anderes Format transformiert.
In diesem Beispiel wird Folgendes veranschaulicht:
So kann sich ein Client mithilfe eines Benutzernamen-/Kennwortpaars authentifizieren.
Wie ein Client mit einem benutzerdefinierten Tokenanbieter konfiguriert werden kann.
Wie der Server die Clientanmeldeinformationen mithilfe eines Kennworts mit einem benutzerdefinierten UserNamePasswordValidator Kennwort überprüfen kann, das überprüft, ob der Benutzername und das Kennwort übereinstimmen.
Wie der Server vom Client mithilfe des X.509-Zertifikats des Servers authentifiziert wird.
In diesem Beispiel wird auch gezeigt, wie auf die Identität des Aufrufers nach dem benutzerdefinierten Tokenauthentifizierungsprozess zugegriffen werden kann.
Der Dienst macht einen einzelnen Endpunkt für die Kommunikation mit dem Dienst verfügbar, der mithilfe der App.config Konfigurationsdatei definiert ist. Der Endpunkt besteht aus einer Adresse, einer Bindung und einem Vertrag. Die Bindung ist standardmäßig mit wsHttpBinding konfiguriert und verwendet dabei von Haus aus die Nachrichtensicherheit. In diesem Beispiel wird der Standard wsHttpBinding für die Verwendung der Authentifizierung mit dem Benutzernamen des Clients festgelegt. Außerdem konfiguriert der Dienst das Dienstzertifikat mit dem serviceCredentials-Verhalten. Mit dem serviceCredentials-Verhalten können Sie ein Dienstzertifikat konfigurieren. Ein Dienstzertifikat wird von einem Client verwendet, um den Dienst zu authentifizieren und Nachrichtenschutz bereitzustellen. Die folgende Konfiguration verweist auf das localhost-Zertifikat, das während des Beispielsetups installiert ist, wie in den folgenden Setupanweisungen beschrieben.
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<!-- configure base address provided by host -->
<add baseAddress ="http://localhost:8000/servicemodelsamples/service"/>
</baseAddresses>
</host>
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="False" />
<!--
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.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Die Clientendpunktkonfiguration besteht aus einem Konfigurationsnamen, einer absoluten Adresse für den Dienstendpunkt, der Bindung und dem Vertrag. Die Clientbindung wird mit dem entsprechenden Mode und der entsprechenden clientCredentialType-Nachricht konfiguriert.
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost:8000/servicemodelsamples/service"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator">
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
Die folgenden Schritte zeigen, wie Sie einen benutzerdefinierten Tokenanbieter entwickeln und in das WCF-Sicherheitsframework integrieren:
Schreiben Sie einen benutzerdefinierten Tokenanbieter.
Im Beispiel wird ein benutzerdefinierter Tokenanbieter implementiert, der den Benutzernamen und das Kennwort abruft. Das Kennwort muss diesem Benutzernamen entsprechen. Dieser benutzerdefinierte Tokenanbieter dient nur zu Demonstrationszwecken und wird nicht für die reale Bereitstellung empfohlen.
Um diese Aufgabe auszuführen, leitet der benutzerdefinierte Tokenanbieter die SecurityTokenProvider Klasse ab und überschreibt die GetTokenCore(TimeSpan) Methode. Diese Methode erstellt und gibt eine neue
UserNameSecurityTokenzurück.protected override SecurityToken GetTokenCore(TimeSpan timeout) { // obtain username and password from the user using console window string username = GetUserName(); string password = GetPassword(); Console.WriteLine("username: {0}", username); // return new UserNameSecurityToken containing information obtained from user return new UserNameSecurityToken(username, password); }Schreiben Sie einen benutzerdefinierten Sicherheitstoken-Manager.
Die SecurityTokenManager wird zur Erstellung von SecurityTokenProvider für eine bestimmte SecurityTokenRequirement verwendet, die in der
CreateSecurityTokenProvider-Methode übergeben wird. Der Sicherheitstoken-Manager wird auch zum Erstellen von Tokenauthentifikatoren und einem Token serialisierer verwendet, dies wird jedoch nicht von diesem Beispiel abgedeckt. In diesem Beispiel erbt der benutzerdefinierte Sicherheitstoken-Manager von der ClientCredentialsSecurityTokenManager Klasse und überschreibt dieCreateSecurityTokenProviderMethode, um einen benutzerdefinierten Benutzernamen-Token-Anbieter zurückzugeben, wenn die übergebenen Tokenanforderungen angeben, dass der Benutzernamenanbieter angefordert wird.public class MyUserNameSecurityTokenManager : ClientCredentialsSecurityTokenManager { MyUserNameClientCredentials myUserNameClientCredentials; public MyUserNameSecurityTokenManager(MyUserNameClientCredentials myUserNameClientCredentials) : base(myUserNameClientCredentials) { this.myUserNameClientCredentials = myUserNameClientCredentials; } public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement) { // if token requirement matches username token return custom username token provider // otherwise use base implementation if (tokenRequirement.TokenType == SecurityTokenTypes.UserName) { return new MyUserNameTokenProvider(); } else { return base.CreateSecurityTokenProvider(tokenRequirement); } } }Schreiben Sie benutzerdefinierte Clientanmeldeinformationen.
Die Clientanmeldeinformationsklasse wird verwendet, um die Anmeldeinformationen darzustellen, die für den Clientproxy konfiguriert sind, und erstellt einen Sicherheitstoken-Manager, der zum Abrufen von Tokenauthentifikatoren, Tokenanbietern und einem Token serializer verwendet wird.
public class MyUserNameClientCredentials : ClientCredentials { public MyUserNameClientCredentials() : base() { } protected override ClientCredentials CloneCore() { return new MyUserNameClientCredentials(); } public override SecurityTokenManager CreateSecurityTokenManager() { // return custom security token manager return new MyUserNameSecurityTokenManager(this); } }Konfigurieren Sie den Client für die Verwendung der benutzerdefinierten Clientanmeldeinformationen.
Damit der Client die benutzerdefinierten Clientanmeldeinformationen verwenden kann, löscht das Beispiel die Standardmäßige Clientanmeldeinformationsklasse und stellt die neue Clientanmeldeinformationsklasse bereit.
static void Main() { // ... // Create a client with given client endpoint configuration CalculatorClient client = new CalculatorClient(); // set new credentials client.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials)); client.ChannelFactory.Endpoint.Behaviors.Add(new MyUserNameClientCredentials()); // ... }
Um beim Dienst die Informationen zu den Aufrufern anzuzeigen, können Sie PrimaryIdentity verwenden, wie im folgenden Beispielcode gezeigt. Current enthält Informationen zu den Ansprüchen des aktuellen Aufrufers.
static void DisplayIdentityInformation()
{
Console.WriteLine("\t\tSecurity context identity : {0}",
ServiceSecurityContext.Current.PrimaryIdentity.Name);
}
Wenn Sie das Beispiel ausführen, werden die Vorgangsanforderungen und -antworten im Clientkonsolenfenster angezeigt. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.
Batchdatei einrichten
Mit der in diesem Beispiel enthaltenen Setup.bat Batchdatei können Sie den Server mit dem entsprechenden Zertifikat so konfigurieren, dass eine selbst gehostete Anwendung ausgeführt wird, die serverzertifikatbasierte Sicherheit erfordert. Diese Batchdatei muss so geändert werden, dass sie auf Computern oder in einem nicht gehosteten Fall funktioniert.
Im Folgenden finden Sie eine kurze Übersicht über die verschiedenen Abschnitte der Batchdateien, um sie entsprechend zu konfigurieren und auszuführen.
Erstellen des Serverzertifikats.
Die folgenden Zeilen aus der Setup.bat Batchdatei erstellen das zu verwendende Serverzertifikat. Die
%SERVER_NAME%Variable gibt den Servernamen an. Ändern Sie diese Variable, um Ihren eigenen Servernamen anzugeben. Der Standardwert in dieser Batchdatei ist 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 -peInstallieren des Serverzertifikats im vertrauenswürdigen Zertifikatspeicher des Clients:
Die folgenden Zeilen in der Setup.bat Batchdatei kopieren das Serverzertifikat in den Clientspeicher für vertrauenswürdige Personen. Dieser Schritt ist erforderlich, da von Makecert.exe generierte Zertifikate nicht implizit vom Clientsystem vertrauenswürdig sind. Wenn Sie bereits über ein Zertifikat verfügen, das in einem vertrauenswürdigen Stammzertifikat des Clients verwurzelt ist, z. B. ein von Microsoft ausgestelltes Zertifikat, ist dieser Schritt zum Auffüllen des Clientzertifikatspeichers mit dem Serverzertifikat nicht erforderlich.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Hinweis
Die Setup.bat Batchdatei soll über eine Windows SDK-Eingabeaufforderung ausgeführt werden. Sie erfordert, dass die MSSDK-Umgebungsvariable auf das Verzeichnis verweist, in dem das SDK installiert ist. Diese Umgebungsvariable wird automatisch in einer Windows SDK-Eingabeaufforderung festgelegt.
So richten Sie das Beispiel ein und erstellen es
Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.
Befolgen Sie zum Erstellen der Projektmappe die Anweisungen unter Erstellen der Windows Communication Foundation-Beispiele.
So führen Sie das Beispiel auf demselben Computer aus
Führen Sie Setup.bat aus dem Beispielinstallationsordner in einer Visual Studio-Eingabeaufforderung aus, die mit Administratorrechten geöffnet wurde. 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.
Starten Sie service.exe von "service\bin".
Starten Sie Client.exe aus \client\bin. Clientaktivität wird in der Clientkonsolenanwendung angezeigt.
Geben Sie an der Eingabeaufforderung "Benutzername" einen Benutzernamen ein.
Verwenden Sie an der Kennwortaufforderung dieselbe Zeichenfolge, die für die Eingabeaufforderung für den Benutzernamen eingegeben wurde.
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
Erstellen Sie ein Verzeichnis auf dem Dienstcomputer für die Dienstbinärdateien.
Kopieren Sie die Dienstprogrammdateien in das Dienstverzeichnis auf dem Dienstcomputer. Kopieren Sie auch die dateien Setup.bat und Cleanup.bat auf den Dienstcomputer.
Sie müssen über ein Serverzertifikat mit dem Betreffnamen verfügen, der den vollqualifizierten Domänennamen des Computers enthält. Die datei Service.exe.config muss aktualisiert werden, um diesen neuen Zertifikatnamen widerzuspiegeln. Sie können ein Serverzertifikat erstellen, indem Sie die Setup.bat Batchdatei ändern. Beachten Sie, dass die setup.bat Datei über eine Entwickler-Eingabeaufforderung für Visual Studio ausgeführt werden muss, die mit Administratorrechten geöffnet wird. Sie müssen die Variable
%SERVER_NAME%auf den vollqualifizierten Hostnamen des Computers festlegen, der zum Hosten des Diensts verwendet wird.Kopieren Sie das Serverzertifikat in den CurrentUser-TrustedPeople Speicher des Clients. Dies ist nicht erforderlich, wenn das Serverzertifikat von einem vertrauenswürdigen Clientherausgeber ausgestellt wird.
Ändern Sie in der datei Service.exe.config auf dem Dienstcomputer den Wert der Basisadresse, um einen vollqualifizierten Computernamen anstelle von localhost anzugeben.
Führen Sie auf dem Dienstcomputer das Kommando service.exe über eine Eingabeaufforderung aus.
Kopieren Sie die Clientprogrammdateien aus dem Ordner "\client\bin\" unter dem sprachspezifischen Ordner auf den Clientcomputer.
Ä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.
Starten Sie
Client.exeauf dem Clientcomputer über ein Eingabeaufforderungsfenster.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.