Pregunta

Tengo una aplicación de control de máquina donde tengo una sola computadora cliente y cinco cajas de servidores que se comunican en la subred de la máquina. No hay controlador de dominio. Me gustaría utilizar netTcpBinding para permitir confiabilidad y soporte de transacciones.

¿Es posible usar la autenticación de nombre de usuario / contraseña con este enlace, cuando un controlador de dominio no está presente? Preferiría no usar un certificado ya que no quiero administrar certificados en 900 computadoras (150 máquinas) que no se conectarán a la LAN de la oficina.

¿Fue útil?

Solución

Sí, por supuesto, pero solo si usa Seguridad de mensajes (en lugar de seguridad de transporte). Defina su configuración de enlace de esta manera:

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

y luego haga referencia a esa configuración de enlace en sus puntos finales (en el servidor y el cliente):

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

Marc

ACTUALIZACIÓN:
Ah, sí, en el lado del servidor, necesitará un certificado para autenticar el servicio al cliente que lo llama, y ??también se usa para cifrar + firmar los mensajes. Eso solo está en el servidor: los clientes no necesitan instalar nada.

Configuración:

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

Asegúrese de instalar el certificado de su servidor en la " Máquina local " carpeta en su servidor, debajo del " nombre del sujeto " que especifique en su configuración.

Otros consejos

Hay algo que puedes probar primero. Establezca serviceNegotiationCredentials en true:

<message negotiateServiceCredential="true"/>

Esto creará una conversación segura entre su cliente y su servicio sin un controlador de dominio.

PERO, si no hay ningún controlador de dominio, el cliente no confía en su servicio, por lo que fallará.

Por lo tanto, debe establecer la identidad del servicio esperada. Puede encontrar eso en el WSDL de su servicio. De forma predeterminada, si está alojado en IIS, parece ser:

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

No creo que lo necesite, pero tal vez tendrá que permitir el inicio de sesión anónimo en el lado del servicio:

<serviceBehaviors>
    <behavior>
        <serviceCredentials>
            <windowsAuthentication allowAnonymousLogons="true"/>
        </serviceCredentials>
    </behavior>
</serviceBehaviors>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top