with servicio publicar password paso example custom crear consumir and wcf authentication authorization certificate x509

servicio - wcf service c# example



Nombre de usuario de WCF sin certificado (3)

Respuesta corta; 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.

Estoy trabajando en un proyecto donde necesito lo siguiente.

  • 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 de la 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. Entonces mi plan era hacer lo siguiente ...

Cree un ServiceAuthorizationManager personalizado para el servidor y allí iniciaré sesión en el usuario y obtendré los roles de la aplicación existente. Voy a guardar en caché el objeto "Sitio", y luego de otros requisitos extraer de la memoria caché. También necesitaré un objeto CustomPrincipal para guardar mis datos personalizados. Quiero suplantar al usuario para poder usar las funciones integradas que se filtran en WCF de esta manera:

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

Intenté usar la autorización de ASP.NET con un proveedor de roles personalizado, pero no pude establecer nada en el Principal 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 de WCF, de la siguiente manera.

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

Cuando comencé a seguir esta ruta, noté que no podía obtener el nombre de usuario / contraseña en el método CheckAccessCore de mi clase de administrador. 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 entender 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?


En realidad, es posible, pero deberá implementar su propio enlace.

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


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

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

Usando las soluciones listas para usar (sin implementar su propio enlace), WCF le recomienda (requiere) que use 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 seguramente una solución, pero lo pensaría dos veces antes de usarlo.