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?