2009-08-03 13 views
9

Ho un'applicazione di controllo della macchina in cui ho un computer client singolo e cinque caselle server che comunicano sulla subnet della macchina. Non esiste un controller di dominio. Vorrei utilizzare netTcpBinding per consentire l'affidabilità e il supporto delle transazioni.netTcpBinding senza credenziali di Windows?

È possibile utilizzare l'autenticazione nome utente/password con questa associazione, quando non è presente un controller di dominio? Preferirei non utilizzare un certificato perché non voglio gestire i certificati su 900 computer (150 macchine) che non saranno collegati alla LAN dell'ufficio.

risposta

10

Sì, certo, ma solo se si utilizza la sicurezza dei messaggi (anziché la sicurezza del trasporto). Definire la configurazione di legame in questo modo:

<netTcpBinding> 
    <binding name="UserNameSecurity"> 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </netTcpBinding> 

e quindi fare riferimento tale configurazione vincolante gli endpoint (su server e client):

<endpoint address="....." 
      binding="netTcpBinding" 
      bindingConfiguration="UserNameSecurity" 
      contract="IMyService" /> 

Marc

UPDATE:
Ah, sì, sul lato server, è necessario un certificato per authenicare il servizio al client che lo chiama, e viene anche utilizzato per crittografare + firmare i messaggi. Questo è solo sul server - i client non devono installare nulla.

Configurazione:

<behaviors> 
    <serviceBehavior> 
    <behavior name="ServerInternet"> 
     <serviceCredentials> 
     <serviceCertificate 
      findValue="MyServiceCertificate" 
      storeLocation="LocalMachine" 
      storeName="My" 
      x509FindType="FindBySubjectName" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehavior> 
</behaviors> 
<services> 
    <service name="MyServiceInternet" 
      behaviorConfiguration="ServerInternet"> 
    .... 
    </service> 
</services> 

Assicurarsi di installare il certificato del server nella cartella "Computer locale" sul server, con il "nome del soggetto" che si specifica nella propria configurazione.

+0

Quindi, questo è quello che avevo originariamente. Tuttavia, ottengo un'eccezione che richiede un certificato di servizio: "Il certificato di servizio non è fornito. Specifica un certificato di servizio in ServiceCredentials." Qualche idea? –

+0

Hmmm. Questo è quello che sospettavo. Grazie per averlo confermato. –

+0

In questo approccio c'è qualche danno nell'usare un certificato autofirmato nell'ambiente di produzione? Se è usato solo per crittografare i messaggi ma non per verificare l'identità. Quando non utilizzeresti un certificato autofirmato per la crittografia dei messaggi? – Vitalik

0

C'è qualcosa che puoi provare per primo. Impostare serviceNegotiationCredentials true:

<message negotiateServiceCredential="true"/> 

Questo creerà una conversazione protetta tra il client e il servizio, senza un controller di dominio.

MA, se non c'è alcun controller di dominio, il client non si fida del tuo servizio, quindi fallirà.

Quindi è necessario impostare l'identity of the service previsto. Puoi trovarlo nel WSDL del tuo servizio. Per impostazione predefinita, se sono ospitati su IIS, sembra essere:

<client> 
    <endpoint> 
     <identity> 
      <servicePrincipalName value="host/NETWORKSERVICE"></servicePrincipalName> 
     </identity> 
    </endpoint> 
</client> 

non credo che ne avrai bisogno, ma forse si dovrà consentire l'accesso anonimo sul lato del servizio:

<serviceBehaviors> 
    <behavior> 
     <serviceCredentials> 
      <windowsAuthentication allowAnonymousLogons="true"/> 
     </serviceCredentials> 
    </behavior> 
</serviceBehaviors> 
+1

Grazie. Penso che il negotiateServiceCredential non esiste per netTcpBinding. Probabilmente andrò lungo il percorso del certificato, poiché sembra (relativamente) diretto. –