CardSpace-Verbund

Dieses Beispiel veranschaulicht das Konfigurieren einer benutzerdefinierten Bindung zur Verwendung einer CardSpace in einem Webdienst.

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 Informationskarte. Der CalculatorService definiert und implementiert einen Dienstvertrag mit dem Namen ISecureCalculator, wie im folgenden Beispielcode dargestellt.

[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 alle Ansprüche, die ursprünglich von dem Dienst angefordert wurden.

public string GetIdentity()
{
    string identity = String.Empty;

    AuthorizationContext ctx = OperationContext.Current.ServiceSecurityContext.AuthorizationContext;
    
    foreach (ClaimSet claimSet in ctx.ClaimSets)
    {
        foreach (Claim claim in claimSet)
        {
            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 CardSpace von Anfordernden 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="wsFederationHttpBinding"
              bindingConfiguration="requireInfoCard"
              contract="Microsoft.ServiceModel.Samples.ISecureCalculator" >
      <identity>
        <certificateReference findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50" 
                              x509FindType="FindByThumbprint" 
                              storeLocation="LocalMachine" 
                              storeName="My" />
      </identity>
    </endpoint>
    <!-- the mex endpoint is explosed at https://localhost/servicemodelsamples/service.svc/mex -->
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>
</services>

<bindings>
  <wsFederationHttpBinding>
    <binding name="requireInfoCard">
      <security mode="Message">
        <message issuedTokenType="urn:oasis:names:tc:SAML:1.0:assertion">
          <claimTypeRequirements>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"/>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"/>
            <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifer"/>
          </claimTypeRequirements>
          <issuer address="https://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self"/>
        </message>
      </security>
    </binding>
  </wsFederationHttpBinding>
</bindings>

Der Dienst konfiguriert außerdem ein Verhalten, um das Dienstzertifikat festzulegen, das von dem 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 sie 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 für den ISecureCalculator-Vertrag extrahiert den im SAML-Token bereitgestellten Anspruch der E-Mail-Adresse und sendet ihn zurück an den Aufrufer.

Der Client kommuniziert mit dem Dienst mithilfe einer typisierten Windows Communication Foundation (WCF)-Clientklasse, die von dem Service Metadata Utility Tool (Svcutil.exe) erzeugt wird. Die typisierte WCF-Clientklasse ist in der Datei "GeneratedClient.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 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="wsFederationHttpBinding"
                contract="Microsoft.ServiceModel.Samples.ISecureCalculator"
                behaviorConfiguration="ClientCredentials">
        <identity>
          <certificateReference
          findValue="545c3b8e97d99fd75c75eb52c6908320088b4f50" 
          x509FindType="FindByThumbprint"
          storeLocation="CurrentUser" 
          storeName="TrustedPeople" />
        </identity>
      </endpoint>
    </client>

    <bindings>
      <wsFederationHttpBinding>
        <binding name="requireInfoCard">
          <security mode="Message">
            <message issuedTokenType="urn:oasis:names:tc:SAML:1.0:assertion">
              <claimTypeRequirements>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"/>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"/>
                <add claimType  ="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"/>
              </claimTypeRequirements>
              <issuer address="https://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self"/>
            </message>
          </security>
        </binding>
      </wsFederationHttpBinding>
    </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" >
          <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 aus dem SAML-Token extrahierten Anspruch. Der Client ruft anschließend die Rechnervorgänge des Diensts auf, und die Antworten werden im Konsolenfenster angezeigt.

claims requested by the service = [System.Byte[]] [someone@example.com] [Someone] [Example] [IdjUW0O7xWVaga5AODCOuM070Ll9SfsPtYYfo8pKi7s=]
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 Computer oder computerübergreifend ausführen möchten, befolgen Sie die Anweisungen in den folgenden Verfahren. Führen Sie vor allem "Setup.bat" im sprachspezifischen Unterverzeichnis des Beispielinstallationsverzeichnisses aus.

    Tipp

    Die Batchdatei "Setup.bat" ist darauf 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 folgen Sie den 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 <CS,VB>\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 Beispielverzeichnisses aus. Auf diese Weise wird das Fabrikam-Contoso-Public.cer-Zertifikat in den CurrentUser/TrustedPeople-Zertifikatspeicher für die 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.

  3. Erstellen Sie die Beispiel-Visual Studio-Projektmappendatei "CardSpace.sln", die sich im sprachspezifischen Beispielordner 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 <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 Server, der den Dienst hostet:

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

    2. Importieren Sie das <CS,VB>\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 Beispielverzeichnisses 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. 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.

    4. Erstellen Sie das <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 Unterverzeichnis des Beispielordners die Datei "Cleanup.bat" aus.

  1. 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\UsingWsFederation auf den Computer.
    2. Führen Sie "Setup.bat" im sprachspezifischen Unterverzeichnis des Beispielverzeichnisses aus. Sie müssen das in "Fabrikam-Contoso.pfx" enthaltene Dienstzertifikat nicht installieren.
    3. Erstellen Sie das <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 Diensts übereinstimmt.
  2. Führen Sie "Client\Bin\Client.exe" aus.

Tipp

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

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