2008-12-18 20 views
6

Estoy trabajando en un proyecto donde necesito lo siguiente.WCF nombre de usuario sin certificado

  • servicio WCF en el lado del servidor (.NET 3.5)
  • cliente WPF para el lado del cliente (.NET 3,0)

tengo una aplicación existente que tengo que usar la autenticación y autorización de (en el lado del servidor). También necesito almacenar algunos metadatos sobre el usuario en el Thread Principal del Servicio WCF (un objeto del sitio). Hago esto para poder acceder al servicio WCF si tengo que hacerlo; cierta lógica comercial puede requerirlo. Así que mi plan era hacer lo siguiente ...

Crear un ServiceAuthorizationManager personalizado para el servidor y allí voy a iniciar sesión en el usuario y obtener los roles de la aplicación existente. Guardaré en caché el objeto "Sitio", y luego de otros requisitos extraeré del caché. También necesitaré un objeto CustomPrincipal para guardar mis datos personalizados. Quiero suplantar al usuario para que pueda utilizar las funciones incorporadas de filtrado en WCF como esto:

[PrincipalPermission(SecurityAction.Demand, Role = "Role1")] 
public string[] RolesForUser(string username){} 

he tratado de utilizar la autorización ASP.NET con un proveedor de funciones personalizadas, pero no era capaz de establecer cualquier cosa en el director actual. También intenté usar una IAuthorizationPolicy personalizada, pero surgieron problemas. Estos problemas tenían que ver con poder usar la aplicación WCFClient.exe, cuando descubría (usando el endpoing de mex) no daría ninguna credencial, por lo que el inicio de sesión fallaría. Finalmente decidí que un ServiceAuthorizationManager era el camino correcto, pero estoy abierto a otras sugerencias.

En el cliente reuniré las credenciales y las incluiré en la clase de proxy WCF, de la siguiente manera.

proxy.ChannelFactory.Credentials.UserName.UserName = userName; 
proxy.ChannelFactory.Credentials.UserName.Password = password; 

A medida que empecé a ir por este camino, me di cuenta de que yo no era capaz de obtener el nombre de usuario/contraseña en el método CheckAccessCore de mi clase de gerente. La investigación adicional mostró que realmente debería estar autenticando en un UserNamePasswordValidator personalizado. Entonces creé uno de esos. El problema es que el método de validación nunca se llamó.

La investigación adicional mostró que para que se llame al método de validación mi servicio WCF debe tener seguridad de mensajes o de nivel de transporte. El problema con eso es que no puedo averiguar cómo tener un mensaje o seguridad de nivel de transporte sin un certificado X.509. Este producto va a varios cientos de máquinas increíblemente bloqueadas, y la instalación de un certificado no es posible.

¿Hay alguna manera de hacer lo que estoy pidiendo sin instalar un certificado?

Respuesta

6

Respuesta breve; no puedes Tan pronto como use el nombre de usuario/contraseña, necesita algún tipo de canal seguro.

Sin embargo, no necesita certificados en los clientes; solo en el servidor.

22

En realidad es posible, pero deberá implementar su propia encuadernación.

Yaron Naveh desarrolló un enlace WCF que permite borrar el nombre de usuario/contraseña a través de HTTP. Su article incluye el código para el enlace.

1

No conozco los detalles de su infraestructura de red, pero si se encuentra en un dominio de Windows, debería considerar el uso de las credenciales de Windows.

Es posible usar un mensaje de seguridad sin certificados si usa las credenciales de Windows. Este es el comportamiento predeterminado de wsHttpBinding (out of the box).

Utilizando las soluciones listas para usar (sin implementar su propio enlace) WCF le recomienda (requiere) usar un canal seguro siempre que las credenciales de autenticación estén incluidas en los mensajes.

Usar una unión personalizada que le permita especificar credenciales en texto claro es sin duda una solución, pero lo pensaría dos veces antes de usarlo.

Cuestiones relacionadas