post icon

Agregar Seguridad con Autenticación Básica HTTP con WebAPI

Al crear un Web Service con WebAPI de MVC.Net en muchos casos podríamos necesitar agregar autenticación ante las operaciones. Esto se puede resolver de muchas formas simples y combinadas.

El mecanismo que veremos será autenticación básica en el Header HTTP mediante los módulos de IIS.

En el proyecto creamos un controlador nuevo con este método de ejemplo:

// GET api/factura
public IEnumerable<string> Get()
{
	return new string[] { "value1", "value2" };
}

Al ejecutar esto veríamos así

2016-01-26

Hasta ahí sería normal y sin autenticación, para agregar insertamos esta linea encima del método

[Authorize]
// GET api/factura
public IEnumerable<string> Get()
{
	return new string[] { "value1", "value2" };
}

Si lo ejecutamos ahora así mismo, nos devolvería error 401. Ahora creamos una clase nueva en la raíz de nuestro proyecto, puede tener el nombre que quieran

public class BasicAuthModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.AuthenticateRequest += OnAuthenticateRequest;
        }

        private void OnAuthenticateRequest(object sender, EventArgs e)
        {
            var application = (HttpApplication)sender;
            var request = new HttpRequestWrapper(application.Request);

            var authData = request.Headers["Autorizacion"];

            if (!string.IsNullOrEmpty(authData))
            {
                var user = authData.Substring(0, authData.IndexOf(':'));
                var password = authData.Substring(authData.IndexOf(':') + 1);

                if (Autenticar()) // Aquí escriben la logica de autenticacion que necesiten
                {
                    var principal = new GenericPrincipal(new GenericIdentity(user), null);
                    PutPrincipal(principal);
                }
            }
        }

        public void Dispose()
        {

        }

        private void PutPrincipal(IPrincipal principal)
        {
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }
    }

El nombre del parámetro del header lo pueden personalizar, en el ejemplo lo llamé “Autorizacion”, también es personalizable el valor a enviar, muchas personas acostumbran a enviar el tipo de autenticación y los valores del usuario y password codificados en Base64, ya dependerá de ustedes la implementación final, pero recuerden que codificar no es lo mismo que encriptar. Este tipo de autenticación es únicamente confiable si se utiliza sobre HTTPS. Para mejorar la seguridad sin HTTPS, tendrían que utilizar un algoritmo para cifrar con una frase que conozcan ambos extremos (servidor y cliente) además de tener un sistema de tokens utilizables una sola vez. Con eso se lograría una seguridad bastante robusta, pero aún vulnerable a “Man-in-the-middle”, que solamente sería evitable nuevamente con HTTPS.

Teniendo este código ya en el proyecto, dentro del web.config necesitamos agregar el handler correspondiente para el IIS

<system.webServer>
    <modules>
      <add name="BasicAuthHttpModule" type="Devtroce.BasicAuthModule, Devtroce"/>
    </modules>
</system.webServer>

Sin título

Comentarios desde Facebook:

Sin Comentarios aun, puedes tú ser el primero en comentar!

Deja tu Comentario

Responder