Domanda

Ok, ho visto alcune domande relative a questo problema, e ho provato un sacco di idee presentate in essi senza successo. Ecco la mia situazione:

Mi colpisce un servizio web su intranet della mia azienda. Ho usato Svcutil.exe per generare la classe cliente per WCF. Sono stato in grado di eseguire la chiamata al servizio web senza alcun problema quando il servizio è stato in fase di sviluppo e non ha richiesto le credenziali di autenticazione, quindi so il codice funziona. A quel tempo, il codice è stato eseguito su SSL. Ho importato il certificato richiesto nella radice Autorità di certificazione negozio di fiducia, e tutto è andato bene.

Abbiamo appena trasferiti in un palcoscenico, e il servizio è stato aggiornato a richiedere le credenziali per la connessione. Ho acceso il mio collegamento con il nuovo punto finale, e il codice per autenticare aggiunto. Questa è la mia prima volta lavorando con WCF, quindi per favore portare con me su eventuali errori evidenti. Il mio problema è che non riesco a individuare il certificato tramite codice per passare al servizio per l'autenticazione. Sto basando questa via di alcuni esempi di codice in linea che ho trovato.

Ecco un esempio del mio config generato da svcutil:

<system.serviceModel>
  <bindings>
   <basicHttpBinding>
    <binding 
        name="xxxSOAPBinding" 
        .... (irrelevant config settings)....
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <security mode="Transport">
      <transport clientCredentialType="Certificate" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
  <client>
   <endpoint address="https://xxxServices_1_0_0"
    binding="basicHttpBinding" bindingConfiguration="xxxSOAPBinding" 
    contract="xxxService" name="xxxService" />
  </client>
 </system.serviceModel>

E qui è il codice che sto usando per tentare di connettersi. L'eccezione viene generata non appena tento di individuare il certificato:

using (var svc = new xxxServiceClient())
{
    svc.ClientCredentials.UserName.UserName = "XXX";
    svc.ClientCredentials.UserName.Password = "XXX";

    svc.ClientCredentials.ClientCertificate
     .SetCertificate(StoreLocation.LocalMachine, StoreName.Root, 
                     X509FindType.FindBySubjectName, "xxx");
...
}

Ho provato diversi X509FindTypes diversi, e li abbinati ai valori sul cert senza successo. C'è qualcosa di sbagliato con il mio codice? C'è un altro modo posso interrogare il negozio CERT per convalidare i valori sto passando?

La macchina dev, dove io sono in esecuzione Visual Studio ha avuto il CERT importata.

È stato utile?

Soluzione

Due domande stupide:

  • stai che il tuo Certificiate è installato a tutti?
  • questo è un Certificiate appositamente per questa macchina messa in scena?

Inoltre, sembra un po 'strano che sei prima di tutto impostare username / password, e poi anche l'impostazione della credenziale. Puoi commentare la parte username / password? Questo fa la differenza?

Marc

Altri suggerimenti

Sei sicuro che il certificato è stato importato nel computer locale, potrebbe essere in negozio CurrentUser.

Questo può sembrare stupido, ma stai certo il nuovo cert per il servizio di messa in scena è stato installato nel tuo negozio cert? Questo è molto probabilmente il problema.

Inoltre, dal momento che lei non ha citato quello che viene generata un'eccezione, è possibile che il problema è che hai impostato le credenziali di nome utente / password prima di impostare le credenziali ClientCertificate, quando la vostra associazione non indica l'utilizzo di nome utente / password. Potrebbe essere un problema lì; sono mutuamente esclusivi, IIRC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top