Freigeben über


Verwenden von CardSpace mit wsHttpBinding

In diesem Beispiel wird veranschaulicht, wie eine wsHttpBinding konfiguriert wird, damit sie CardSpace in einem Webdienst verwendet.

Tipp

Die Setupprozedur und die Erstellungsanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

Dieses Beispiel definiert einen ISecureCalculator-Vertrag, der die Verwendung von persönlichen Identitätsansprüchen erläutert, dargestellt durch eine CardSpace. Der CalculatorService definiert und implementiert einen Dienstvertrag namens ISecureCalculator, wie im folgenden Beispielcode gezeigt:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ISecureCalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
    [OperationContract]
    string GetIdentity();
}

Der Dienst wird für die Verwendung eines SAML-Token konfiguriert, das von CardSpace bereitgestellt wird.

Die Dienstimplementierung des GetIdentity-Vorgangs extrahiert den "private persönliche Bezeichner"-Anspruch (Private-Personal-Identifier, PPID) und gibt ihn in der Antwort zurück. PrivatePersonalIdentifier ist eine eindeutige Konstante mit einem integrierten Datenschutzfeature, das vom Aussteller des Tokens generiert wird. Der Dienst kann diesen Bezeichner neben anderen Informationen (z. B. der Signatur des Ausstellers und anderen Ansprüchen) für die Kontosuche und -authentifizierung verwenden. Der PPID ist von Dienst zu Dienst unterschiedlich, auch wenn die gleiche Karte ausgewählt wird.

const string ppidClaimType = 
"https://schemas.xmlsoap.org/ws/2005/05/identity/claims/ privatepersonalidentifier"; 
public string GetIdentity()
{
 string identity=String.Empty;

 AuthorizationContext ctx = OperationContext.Current.ServiceSecurityContext.AuthorizationContext;

 foreach (ClaimSet claimSet in ctx.ClaimSets)
 {
    foreach (Claim claim in claimSet.FindClaims(ppidClaimType, null))
    {
        identity += claim.Resource as string; 
    }
 }

    return identity;
}

Der Dienst macht einen einzelnen Endpunkt verfügbar, der in der Konfigurationsdatei (Web.config) definiert wird. Für diesen ist eine CardSpace des Anfragenden erforderlich, wie in der folgenden Beispielkonfiguration dargestellt.

   <services>
      <service 
       name="Microsoft.ServiceModel.Samples.CalculatorService" 
       behaviorConfiguration="ServiceCredentials">
        <!-- This endpoint is exposed at the base address provided by host: https://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
         binding="wsHttpBinding"
         bindingConfiguration="requireInfoCard"
         contract="Microsoft.ServiceModel.Samples.ISecureCalculator" >
          <identity>
            <certificateReference 
             findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50" 
             x509FindType="FindByThumbprint" 
             storeLocation="LocalMachine" 
             storeName="My" />
          </identity>
        </endpoint>
        <!-- The mex endpoint is exposed at https://localhost/servicemodelsamples/service.svc/mex. -->
        <endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <wsHttpBinding>
        <binding name="requireInfoCard">
          <security mode="Message">
            <message clientCredentialType="IssuedToken" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

Der Dienst konfiguriert außerdem ein Verhalten, um das Dienstzertifikat festzulegen, das vom Client für die Authentifizierung des Diensts und für das sichere Senden von Nachrichten an den Dienst verwendet wird.

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceCredentials">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceCredentials>
            <serviceCertificate
             findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
             x509FindType="FindByThumbprint"
             storeLocation="LocalMachine"
             storeName="My" />
            <issuedTokenAuthentication allowUntrustedRsaIssuers="true" />
          </serviceCredentials>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

Der Client wird außerdem für die Anforderung eines SAML-Tokens konfiguriert, das von CardSpace bereitgestellt wird. Dieses Token bewirkt, dass die CardSpace-Benutzeroberfläche aufgerufen wird, wenn der erste Aufruf an den Dienst erfolgt. Der Benutzer kann eine entsprechende Informationskarte auswählen und dem Dienst anbieten. Nachdem eine Informationskarte ausgewählt wurde, wird die Anforderung mithilfe eines SAML-Tokens gesichert, das die Identität darstellt. Der GetIdentity-Vorgang auf dem ISecureCalculator-Vertrag extrahiert den PrivatePersonalIdentifer-Anspruch, der in dem SAML-Token bereitgestellt wurde und sendet ihn an den Aufrufer zurück.

Der Client kommuniziert mit dem Dienst mithilfe einer typisierten WCF-Clientklasse, die von dem Service Metadata Utility Tool (Svcutil.exe) erzeugt wird. Die typisierte Windows Communication Foundation (WCF)-Clientklasse ist in der Datei "GeneratedProxy.cs" enthalten.

Die Konfiguration für den Client kann auch mit dem Service Metadata Utility Tool (Svcutil.exe) generiert werden. Das Service Metadata Utility Tool (Svcutil.exe) erstellt die Clientendpunktkonfiguration auf der Grundlage der von dem Dienst veröffentlichten Metadaten. In diesem Beispiel wird die Clientkonfiguration manuell erstellt, indem mit der Dienstkonfiguration begonnen wird.

Der Client muss den clientCredentialType auf IssuedToken festlegen und certificateReference konfigurieren, damit CardSpace den Dienst authentifizieren kann, wie in der folgenden Beispielkonfiguration dargestellt:

    <client>
      <endpoint
       address="https://localhost/ServiceModelSamples/service.svc/"
       bindingConfiguration="requireInfoCard" 
       binding="wsHttpBinding"
       contract="Microsoft.ServiceModel.Samples.ISecureCalculator"
       behaviorConfiguration="ClientCredentials">
        <identity>
          <certificateReference
           findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50" 
           x509FindType="FindByThumbprint"
           storeLocation="CurrentUser" 
           storeName="TrustedPeople" />
        </identity>
      </endpoint>
    </client>

    <bindings>
      <wsHttpBinding>
        <binding name="requireInfoCard">
          <security mode="Message">
            <message clientCredentialType="IssuedToken" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

Zusätzlich zur Bereitstellung des Dienstzertifikats im Endpunkt muss der Client die Zertifikate der vertrauenswürdigen Dienste festlegen. Zu diesem Zweck wird ein Verhalten definiert, das auf die Zertifikate im Zertifikatspeicher verweist, die für den Client vertrauenswürdig sind.

    <behaviors>
      <endpointBehaviors>
        <behavior name="ClientCredentials" 
         includeExceptionDetailInFaults="true">
          <clientCredentials>
            <serviceCertificate>
              <defaultCertificate
               findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50"
               x509FindType="FindByThumbprint"
               storeLocation="CurrentUser"
               storeName="TrustedPeople" />
              <!-- 
            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 certificate 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
               revocationMode="NoCheck"
               certificateValidationMode="PeerOrChainTrust" />
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

Wenn Sie den Client ausführen und die EINGABETASTE drücken, ruft der Client den GetIdentity-Vorgang auf und die CardSpace-Benutzeroberfläche wird gestartet.

  • Wählen Sie eine bereits vorhandene Karte aus dem CardSpace aus, oder erstellen Sie eine neue Karte.
  • Übermitteln Sie die Karte, indem Sie auf Senden klicken.

Die Ansprüche in Ihrer CardSpace werden als SAML-Tokenserialisierung Ihrer CardSpace an den Dienst gesendet. Der GetIdentity-Vorgang des Diensts antwortet mit dem Anspruch, der aus dem SAML-Token extrahiert wurde. Der Client ruft anschließend die Rechnervorgänge des Diensts auf, und die Antworten werden im Konsolenfenster angezeigt.

Identity - (Private Personal ID) =  LGGjXshcVQE1kFMnxccopDBGvYu6gVs2Aexx+4bMlbk=

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.

So richten Sie das Beispiel ein, erstellen es und führen es aus

  1. Vergewissern Sie sich, dass Sie die Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.

  2. Wenn Sie das Beispiel in einer Konfiguration mit einem einzigen Computer oder computerübergreifend ausführen möchten, befolgen Sie die folgenden Anweisungen. Führen Sie vor allem "Setup.bat" im sprachspezifischen Unterverzeichnis des Beispielinstallationsverzeichnisses aus.

    Tipp

    Die Batchdatei "Setup.bat" ist dafür ausgelegt, von einer Windows SDK-Eingabeaufforderung ausgeführt zu werden. Die MSSDK-Umgebungsvariable muss auf das Verzeichnis zeigen, in dem das SDK installiert ist. Diese Umgebungsvariable wird automatisch innerhalb einer Windows SDK-Eingabeaufforderung festgelegt. Stellen Sie für Windows Vista sicher, dass die IIS 6.0-Kompatibilitätsunterstützung mit IIS 7.0 installiert wurde.

  3. Zum Erstellen der C#- oder Visual Basic-Version der Projektmappe befolgen Sie die unter Erstellen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.

  4. Wenn Sie das Beispiel fertig gestellt haben, führen Sie im sprachspezifischen Unterverzeichnis des Beispielinstallationsverzeichnisses die Datei "Cleanup.bat" aus.

So führen Sie das Beispiel auf demselben Computer aus

  1. Importieren Sie das Simple\SampleResources\Fabrikam-Contoso.pfx-Zertifikat in LocalMachine/Mein (persönlicher) Zertifikatspeicher. Das Kennwort für dieses Zertifikat ist xyz.

    Tipp

    Importieren Sie nicht die Datei "Fabrikam-Contoso-Public.cer" anstatt der Datei "Fabrikam-Contoso.pfx".

  2. Führen Sie "Setup.bat" im sprachspezifischen Unterverzeichnis des Verzeichnisses "Simple" aus. Auf diese Weise wird das Fabrikam-Contoso-Public.cer-Zertifikat in den CurrentUser/TrustedPeople-Zertifikatspeicher zur Verwendung durch den Client installiert. Außerdem erhält der IIS-gehostete Webdienst die Berechtigung, den privaten Schlüssel des Fabrikam-Zertifikats zu lesen, der im vorangegangenen Schritt installiert wurde.

    Tipp

    Importieren Sie auf Windows Vista manuell das Zertifikat, und führen Sie dann "Setup.bat" aus. Wenn dieser Schritt nicht ausgeführt wird, wird möglicherweise der Fehler "Der Schlüsselsatz ist nicht vorhanden" ausgegeben.

    Tipp

    Entfernen Sie nach Abschluss des CardSpace-Beispiels die Zertifikate, indem Sie "Cleanup.bat" ausführen. In anderen CardSpace-Beispielen werden die gleichen Zertifikate verwendet. Die Batchdatei "Setup.bat" ist dafür ausgelegt, von einer Windows SDK-Eingabeaufforderung ausgeführt zu werden. Die MSSDK-Umgebungsvariable muss auf das Verzeichnis zeigen, in dem das SDK installiert ist. Diese Umgebungsvariable wird automatisch innerhalb einer Windows SDK-Eingabeaufforderung festgelegt.

  3. Erstellen Sie die Beispiel-Visual Studio-Projektmappendatei "CardSpace.sln", die sich im sprachspezifischen Ordner des Ordners "Simple" befindet.

  4. Um sicherzustellen, dass der Dienst ausgeführt wird, öffnen Sie die folgende Adresse in einem Webbrowser: https://localhost/servicemodelsamples/service.svc. Es wird eine Zusammenfassung des Diensts anzeigt.

  5. Starten Sie "client.exe" von Simple\<CS,VB>\client\bin.

  6. Wenn der Client und der Dienst nicht miteinander kommunizieren können, finden Sie weitere Informationen unter Hinweise zur Fehlerbehebung.

So führen Sie das Beispiel computerübergreifend aus

  1. Auf dem Webserver, auf dem der Webdienst gehostet ist:

    1. Wenn das Beispielquellverzeichnis auf dem Server noch nicht vorhanden ist, kopieren Sie das Verzeichnis TechnologySamples\Basic\Binding\WS\CardSpace\Simple auf den Server.

    2. Importieren Sie das Simple\SampleResources\Fabrikam-Contoso.pfx-Zertifikat in LocalMachine/Mein (persönlicher) Zertifikatspeicher. Das Kennwort für dieses Zertifikat ist xyz.

      Tipp

      Importieren Sie nicht die Datei "Fabrikam-Contoso-Public.cer" anstatt der Datei "Fabrikam-Contoso.pfx".

    3. Führen Sie "Setup.bat" im sprachspezifischen Unterverzeichnis des Verzeichnisses "Simple" aus.

      Tipp

      "Setup.bat" installiert die vom Client benötigten Zertifikate unter CurrentUser/TrustedPeople und kopiert die Logobilder in das virtuelle Verzeichnis ServiceModelSamples. Um dies zu vermeiden, installieren Sie das Zertifikat des Diensts, anstatt "Setup.bat" auszuführen.

    4. Erstellen Sie das Simple\<CS,VB>\service\service.csproj-Projekt.

    5. Um sicherzustellen, dass der Dienst ausgeführt wird, öffnen Sie die folgende Adresse in einem Webbrowser: https://localhost/servicemodelsamples/service.svc. Es wird eine Zusammenfassung des Diensts anzeigt.

      Tipp

      Wenn Sie das Beispiel auf dem Server fertig gestellt haben, führen Sie im sprachspezifischen Verzeichnis des Ordners "Simple" die Datei "Cleanup.bat" aus.

  2. Auf dem Computer, der den Client hostet:

    1. Wenn das Beispielquellverzeichnis auf dem Computer noch nicht vorhanden ist, kopieren Sie das Verzeichnis TechnologySamples\Basic\Binding\WS\CardSpace\Simple auf den Computer.
    2. Führen Sie "Setup.bat" im sprachspezifischen Unterverzeichnis des Verzeichnisses "Simple" aus. Sie müssen das in "Fabrikam-Contoso.pfx" enthaltene Dienstzertifikat nicht installieren.
    3. Erstellen Sie das Simple\<CS,VB>\client\client.csproj-Projekt.
    4. Ändern Sie in der Datei "client\bin\client.exe.config" die Adresse in <endpoint address=" https://localhost/ServiceModelSamples/service.svc" .../>, damit sie mit der neuen Adresse des Webdiensts übereinstimmt.
  3. Führen Sie "client\bin\client.exe" aus.

    Tipp

    Wenn Sie die Ausführung des Beispiels beendet haben, führen Sie "Cleanup.bat" aus.

  4. Wenn der Client und der Dienst nicht miteinander kommunizieren können, finden Sie weitere Informationen unter Hinweise zur Fehlerbehebung.

So bereinigen Sie nach dem Beispiel

  1. Führen Sie "Cleanup.bat" im sprachspezifischen Unterverzeichnis des Beispielinstallationsverzeichnisses aus.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.