¿Cómo usar la autenticación Servicestack con la autenticación de Active Directory / Windows?


Estoy creando un servicio público seguro (SSL) donde las credenciales de los usuarios residen en Active Directory. Quiero aprovechar la autenticación de ServiceStack y he leído el artículo wiki . Ya tengo un código escrito para verificar las credenciales de usuario con AD. Tengo algunas preguntas.

  1. ¿Qué proveedor de autenticación utilizo? ¿Credenciales, Autenticación Básica o Personalizada? El servicio requiere SSL, por lo que la autenticación básica sería segura, sin embargo, las contraseñas se cifrarían para agregar seguridad.
  2. ¿Todavía necesito almacenar el UserAuth y almacenar en caché la AuthUserSession?
  3. ¿El cliente monotouch admitirá la autenticación?

Actualización 2: Terminé haciendo un servicio de prueba SS que se integró con AD, utilizando CredentialsAuthProvider. Sin embargo, mi objetivo final es tener 1 sitio que es una api cuando son llamados por los clientes. Así que básicamente un sitio MVC SS.

Actualización:

Tengo entendido que después de hacer más investigación SS está considerando hacer un producto comercial que puede admitir la autenticación de Windows en el futuro. Leí esto en un comentario de mythz en el grupo de Google SS. La razón por la que hice esta pregunta es que mi empresa construye aplicaciones internas utilizando IWA y adoptar SS MVC es difícil sin IWA. Creo que leí que usted podría alojar el sitio SS MVC fuera de un ASP.NET sitio que utiliza IWA pero aún no lo he probado.

Author: BrandonG, 2012-10-25

2 answers

También he conectado ServiceStack con Autenticación Integrada de Windows (para una aplicación corporativa), y la clave era omitir el intento de integrarlo con los AuthProviders de ServiceStack por completo, ya que el enfoque general de IWA no se ocupa de las credenciales en el código de su aplicación it es manejado por el servidor web. Lo que hice fue:

  1. Configure el sitio / la aplicación en IIS para que la autenticación de Windows sea la única opción habilitada. (No se permite acceso anónimo.) Este significa que el propio IIS se encargará de la secuencia desafío-respuesta (HTTP 401/200) con los usuarios no autenticados, y se encargará de la parte de autenticación del proceso por usted.

  2. Implementar el IHasRequestFilter de ServiceStack (un filtro de pre-solicitud HTTP) como un atributo (por ejemplo, [AdminOnly]). El método RequestFilter de este filtro obtiene el nombre de usuario actual de HttpContext (HttpContext.User.Identity.Name), lo busca en un repositorio (que podría ser una base de datos SQL, un archivo plano, etc.), almacena en caché los resultados utilizando ServiceStack ICacheClient (caché de memoria, Redis, etc.), y lanza un HTTPError 403 si no está autorizado.

Con esto hecho, todo lo que era necesario era agregar el atributo a las clases o métodos donde se desee (que obtiene esta autenticación / autorización en la canalización de servicios donde se desee), y registrar mi proveedor de caché deseado en mi implementación de AppHost, por ejemplo:

 container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false });

Funciona muy bien.

 5
Author: Nick Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-14 19:26:39

Esto es lo que dijo Demis Bellot en twitter. Probablemente posible, pero necesita más investigación.

No es algo que he investigado, no trabajar en la Victoria / Activo Directorio más. Requiere algo de I + D para encontrar/resolver el problema

Finalmente conseguí un servicio prototipo trabajando con AD. Implementé el CredentialsAuthProvider. Ahora esto no está ligado a ASP.NET IWA en absoluto, pero comprueba fácilmente si el usuario está en AD. Esperemos que esto pueda ayudar alguien.

public class LDAPAuthProvider : CredentialsAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
                    {
                        //Check to see if the username/password combo is valid, an exception will be thrown if the username or password is wrong
                        try
                        {
                            DirectoryEntry entry = new DirectoryEntry(ConfigurationManager.AppSettings["TargetOU"], userName, password);
                            object nativeObject = entry.NativeObject;
                        }
                        catch (Exception)
                        {
                            //This means the username/password combo failed
                            return false;
                        }

                        return true;
                    }
}
 5
Author: BrandonG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-29 16:59:48