Utilizzo di CardSpace con wsHttpBinding

In questo esempio viene illustrato come configurare un'associazione wsHttpBinding per utilizzare CardSpace in un servizio Web.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine dell'argomento.

L'esempio definisce un contratto ISecureCalculator per illustrare l'utilizzo di attestazioni di identità personali rappresentate da una CardSpace. CalculatorService definisce e implementa un contratto di servizio di nome ISecureCalculator come illustrato nell'esempio di codice seguente:

[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();
}

Il servizio è configurato per richiedere un token SAML fornito da una CardSpace.

L'implementazione del servizio dell'operazione GetIdentity estrae l'attestazione ID personale privato (PPID) richiesta e la restituisce nella risposta. PrivatePersonalIdentifier è una costante univoca con una funzionalità di riservatezza incorporata generata dall'autorità emittente del token. Il servizio può utilizzare questo identificatore per la ricerca e l'autenticazione dell'account, insieme ad altre informazioni, ad esempio la firma dell'autorità emittente e altre attestazioni. La PPID varia da servizio a servizio, anche se viene selezionata la stessa scheda.

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

Il servizio espone un singolo endpoint, definito nel file di configurazione (Web.config), che richiede un CardSpace dai richiedenti, come illustrato nella configurazione di esempio seguente.

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

Il servizio configura anche un comportamento per specificare il certificato del servizio che viene utilizzato dal client per autenticare il servizio e i messaggi protetti inviati al servizio.

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

Il client è configurato anche per richiedere che un token SAML fornito da una CardSpace, che determina l'avvio dell'interfaccia utente dell' CardSpace quando viene eseguita la prima richiesta al servizio. L'utente può selezionare una scheda informazioni appropriata da presentare al servizio. Dopo avere selezionato una scheda informazioni, la richiesta viene protetta utilizzando un token SAML che rappresenta l'identità. L'operazione GetIdentity nel contratto ISecureCalculator estrae l'attestazione PrivatePersonalIdentifer che è stata fornita nel token SAML e la restituisce al chiamante.

Il client comunica con il servizio mediante una classe client WCF tipizzata che viene generata da Service Metadata Utility Tool (Svcutil.exe). La classe client Windows Communication Foundation (WCF) tipizzata è contenuta nel file GeneratedProxy.cs.

La configurazione del client può anche essere generata utilizzando Service Metadata Utility Tool (Svcutil.exe). Service Metadata Utility Tool (Svcutil.exe) crea la configurazione dell'endpoint client basata su metadati pubblicati dal servizio. In questo esempio, la configurazione client viene creata manualmente partendo con la configurazione del servizio.

Il client deve configurare ilclientCredentialType su IssuedToken e configurare certificateReference per consentire all'CardSpace di autenticare il servizio, come illustrato nella configurazione di esempio seguente:

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

Oltre a fornire il certificato del servizio nell'endpoint, il client deve specificare i certificati dei servizi ritenuti attendibili. Ciò viene ottenuto definendo un comportamento per fare riferimento ai certificati nell'archivio certificati attendibile per il client.

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

Quando si esegue tale client e si preme INVIO, questo chiama l'operazione GetIdentity e viene avviata l'interfaccia utente dell' CardSpace.

  • Selezionare un già scheda esistente da CardSpace o crearne una nuova
  • Inviare la scheda scegliendo su Invia.

L'attestazione o le attestazioni nella CardSpace vengono inviate al servizio sotto forma di una serializzazione di token SAML dell'CardSpace. L'operazione del servizio GetIdentity risponde con l'attestazione che è stata estratta dal token SAML. Il client chiama quindi le operazioni della calcolatrice del servizio e le risposte vengono visualizzate nella finestra della console.

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.

Per impostare, compilare ed eseguire l'esempio

  1. Assicurarsi di aver eseguito la Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per eseguire l'esempio su una configurazione con un solo computer o tra computer diversi, seguire le istruzioni seguenti. In particolare, eseguire Setup.bat dalla directory specifica del linguaggio sotto la directory di installazione degli esempi.

    Nota

    Il file batch Setup.bat è progettato per essere eseguito da un prompt dei comandi di Windows SDK. Richiede che la variabile di ambiente MSSDK punti alla directory in cui è installato SDK. Questa variabile di ambiente viene impostata automaticamente all'interno di un prompt dei comandi di SDK di Windows. Per Windows Vista, controllare che il supporto della compatibilità di IIS 6.0 sia installato con IIS 7.0.

  3. Per compilare l'edizione C# o Visual Basic della soluzione, seguire le istruzioni in Generazione degli esempi Windows Communication Foundation.

  4. Terminato con l'esempio, dalla directory specifica del linguaggio sotto la directory di installazione degli esempi, eseguire Cleanup.bat.

Per eseguire l'esempio sullo stesso computer

  1. Impostare il certificato Simple\SampleResources\Fabrikam-Contoso.pfx nell'archivio certificati LocalMachine/My (nodo personale). La password per questo certificato è xyz.

    Nota

    Non importare il file Contoso del Fabrikam-Public.cer invece del file Fabrikam-Contoso.pfx.

  2. Eseguire Setup.bat dalla directory specifica del linguaggio sotto la directory Simple. In tal modo viene installato il certificato Fabrikam-Contoso-Public.cer nell'archivio certificati CurrentUser/TrustedPeople, per l'utilizzo da parte del client. Fornisce inoltre al servizio Web ospitato da IIS l'autorizzazione per leggere la chiave privata del certificato Fabrikam installato nel passaggio precedente.

    Nota

    In Windows Vista, importare manualmente il certificato, quindi eseguire Setup.bat. In caso contrario, può venire generato un errore "keyset non esistente".

    Nota

    Assicurarsi di rimuovere i certificati eseguendo Cleanup.bat dopo avere terminato l'utilizzo degli esempi CardSpace. Gli altri esempi relativi all'CardSpace utilizzano gli stessi certificati. Il file batch Setup.bat è progettato per essere eseguito da un prompt dei comandi di Windows SDK. Richiede che la variabile di ambiente MSSDK punti alla directory in cui è installato SDK. Questa variabile di ambiente viene impostata automaticamente all'interno di un prompt dei comandi di SDK di Windows.

  3. Compilare il file della soluzione Visual Studio di esempio CardSpace.sln situato nella cartella specifica del linguaggio all'interno della cartella Simple.

  4. Per verificare che il servizio sia in esecuzione, aprire l'indirizzo seguente in un browser Web: https://localhost/servicemodelsamples/service.svc che mostra un riepilogo del servizio.

  5. Avviare client.exe da Simple\<CS,VB>\client\bin.

  6. Se il client e il servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi.

Per eseguire l'esempio tra più computer

  1. Sul server che ospita il servizio Web.

    1. Se la directory di origine di esempio non esiste già nel server, copiare la directory TechnologySamples\Basic\Binding\WS\CardSpace\Simple sul server.

    2. Impostare il certificato Simple\SampleResources\Fabrikam-Contoso.pfx nell'archivio certificati LocalMachine/My (nodo personale). La password per questo certificato è xyz.

      Nota

      Non importare il file Contoso del Fabrikam-Public.cer invece del file Fabrikam-Contoso.pfx.

    3. Eseguire Setup.bat dalla directory specifica del linguaggio sotto la directory Simple.

      Nota

      Setup.bat installa il certificato richiesto dal client in CurrentUser/TrustedPeople e copia le immagini del logo nella directory virtuale ServiceModelSamples. Per evitare questo, installare il certificato del servizio invece di eseguire Setup.bat.

    4. Compilare il progetto Simple\<CS,VB>\service\service.csproj.

    5. Per verificare che il servizio sia in esecuzione, aprire l'indirizzo seguente in un browser Web: https://localhost/servicemodelsamples/service.svc che mostra un riepilogo del servizio.

      Nota

      Dopo avere terminato l'esecuzione dell'esempio sul server, eseguire Cleanup.bat dalla directory specifica del linguaggio sotto la directory Simple.

  2. Nel computer che ospita il client:

    1. Se la directory di origine di esempio non esiste già nel computer, copiare la directory TechnologySamples\Basic\Binding\WS\CardSpace\Simple sul computer.
    2. Eseguire Setup.bat dalla directory specifica del linguaggio sotto la directory Simple. Non è necessario installare il certificato del servizio contenuto in Fabrikam-Contoso.pfx.
    3. Compilare il progetto Simple\<CS,VB>\client\client.csproj project.
    4. Nel file client\bin\client.exe.config, modificare l'indirizzo in <endpoint address=" https://localhost/ServiceModelSamples/service.svc" .../> in modo che corrisponda al nuovo indirizzo del servizio Web.
  3. Eseguire client\bin\client.exe.

    Nota

    Dopo avere terminato l'esecuzione dell'esempio, eseguire Cleanup.bat.

  4. Se il client e il servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi.

Per eseguire la pulitura dopo l'esempio

  1. Eseguire Cleanup.bat dalla directory specifica del linguaggio sotto la directory di installazione degli esempi.

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