2009-08-03 23 views
9

Tengo una aplicación de control de máquina donde tengo una sola computadora cliente y cinco cajas de servidor que se comunican en la subred de la máquina. No hay un controlador de dominio Me gustaría utilizar netTcpBinding para permitir la fiabilidad y el soporte de transacciones.netTcpBinding sin credenciales de Windows?

¿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 estarán conectadas a la LAN de la oficina.

Respuesta

10

Sí, por supuesto, pero solo si usa Seguridad de mensajes (en lugar de seguridad de transporte). Definir la configuración de la unión de este modo:

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

y después hacer referencia a que la configuración de la unión en los 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 utiliza para encriptar y firmar los mensajes. Solo 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 servidor en la carpeta "Local Machine" en su servidor, bajo el "nombre de asunto" que especifique en su configuración.

+0

Entonces, eso es lo que tenía originalmente. Pero recibo una excepción solicitando un certificado de servicio: "No se proporciona el certificado de servicio. Especifique un certificado de servicio en ServiceCredentials". ¿Alguna idea? –

+0

Hmmm. Eso es lo que sospechaba. Gracias por confirmarlo –

+0

En este enfoque ¿hay algún daño de usar un certificado autofirmado en el entorno de producción? Si solo se utiliza para cifrar mensajes, pero no para verificar la identidad. ¿Cuándo no usaría un certificado autofirmado para el cifrado de mensajes? – Vitalik

0

Hay algo que puedes probar primero. Establecer serviceNegotiationCredentials true:

<message negotiateServiceCredential="true"/> 

Esto creará una conversación segura entre el cliente y el 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 configurar el esperado identity of the service. Puede encontrarlo en el WSDL de su servicio. Por defecto, si usted está alojado en IIS, que parece ser:

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

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

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

Gracias. Creo que el negotiateServiceCredential no existe para netTcpBinding. Probablemente iré por la ruta del certificado, ya que parece (relativamente) sencillo. –

Cuestiones relacionadas