Autentificando usuario AD a través de un socket TCP

3

Tengo un servidor que se comunica con los clientes a través de un socket .NET. Quiero que el servidor autentique la conexión en un estilo de SSO comprobando que el usuario actual está en un determinado grupo.

La forma ingenua es enviar System.Environment.UserName al servidor y dejar que determine los permisos de usuario en de esta manera .

Sin embargo, parece ir en contra de las mejores prácticas, ya que cualquier cliente puede falsificar el nombre de usuario.

¿Existe una API que pueda usar para enviar las credenciales de manera confiable a mi aplicación de servidor, a través de un socket TCP?

SSL no es suficiente, ya que cualquier persona puede establecer una conexión segura, sin embargo, sigue siendo falsa del nombre de usuario.

    
pregunta Josh Wyant 23.06.2014 - 19:40
fuente

2 respuestas

2

En un mundo de Active Directory, asumiendo que tanto el cliente como el servidor viven en el mismo dominio, entonces la autenticación que ocurrió en el cliente puede mostrarse al servidor, de manera que convenza al servidor. Esto funciona porque un usuario autenticado en una máquina obtiene un "ticket", que en realidad es un tipo de referencia autenticada por el servidor AD; cuando el cliente muestra el ticket al servidor, el servidor puede mostrarlo a su servidor AD, y el servidor AD responderá que, efectivamente, el ticket está bien. Los detalles pueden ser complejos, pero puede dejar todo el trabajo a las bibliotecas de Microsoft.

Si el lado del servidor es un servidor IIS con ASP.NET, y el cliente usa .NET, entonces esto es bastante simple para configurar. Si quieres hacer el trabajo tú mismo, por ejemplo. al usar direct TcpListener y TcpClient , esto implicará, de hecho, más trabajo; vea los enlaces proporcionados por @ makerofthings7.

Tenga en cuenta que seguirá queriendo usar SSL, para frustrar a los intrusos.

Si el cliente y el servidor no son parte del mismo dominio, entonces las cosas se vuelven un poco más complejas, porque la aplicación cliente debe obtener las credenciales correctas (es decir, el nombre de usuario y la contraseña) para el dominio del servidor, mientras se ejecuta la aplicación en el dominio del cliente distinto. De forma alternativa, puede utilizar la autenticación de cliente basada en certificados, que se puede acoplar con SSL; en ese caso, el usuario cliente debe tener un certificado apropiado y una clave privada instalados en su almacén de certificados personales, y la aplicación los usará.

    
respondido por el Thomas Pornin 23.06.2014 - 20:12
fuente
1

Supongo que estás utilizando un cliente WPF o Forms grande y no una página web, porque la respuesta fácil es ADFS v2 en modo pasivo.

Si está usando TCP en bruto, tendrá que inventar mucho del trabajo usted mismo, ya que necesita autenticar la conexión TCP "de alguna manera". ADFS v2 también funciona con clientes activos, y hay ejemplos en el SDK.

La mejor apuesta para las conexiones basadas en TCP / IP es usar RPC, específicamente WCF, (Windows Communication Foundation) con ADFSv2.

¿Por qué etiquetaste este LDAP? ¿Añade contexto a la pregunta? Por favor, elabore.

    
respondido por el random65537 23.06.2014 - 20:01
fuente

Lea otras preguntas en las etiquetas