Domanda

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

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

È stato utile?

Soluzione

Sì, certo - ma solo se si utilizza la sicurezza dei messaggi (anziché la sicurezza dei trasporti). Definisci la tua configurazione di associazione in questo modo:

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

e quindi fai riferimento a quella configurazione di binding nei tuoi endpoint (su server e client):

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

Marc

UPDATE:
Ah, sì, sul lato server, avrai bisogno di un certificato per autenticare il servizio al client che lo chiama, ed è anche usato per crittografare + firmare i messaggi. È 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>

Assicurati di installare il certificato del tuo server in " Local Machine " cartella sul tuo server, sotto il " nome soggetto " che hai specificato nella tua configurazione.

Altri suggerimenti

C'è qualcosa che puoi provare prima. Impostare serviceNegotiationCredentials su true:

<message negotiateServiceCredential="true"/>

Ciò creerà una conversazione sicura tra il tuo client e il tuo servizio senza un controller di dominio.

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

Quindi dovresti impostare l'identità prevista del servizio . Puoi trovarlo nel WSDL del tuo servizio. Per impostazione predefinita, se sei ospitato su IIS, sembra essere:

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

Non credo che ne avrai bisogno, ma forse dovrai consentire l'accesso anonimo sul lato servizio:

<serviceBehaviors>
    <behavior>
        <serviceCredentials>
            <windowsAuthentication allowAnonymousLogons="true"/>
        </serviceCredentials>
    </behavior>
</serviceBehaviors>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top