[Tips] ASP.NET Web API, restringir accesos por IP

Hola que tal, seguimos con estos tips de ASP.NET Web API, esta vez veremos como restringir por IP el acceso a nuestra API, para esto vamos a crear una lista de IP permitidas, luego crearemos un Filtro global , pero primero vamos por parte, en la carpeta Model, voy a crear la siguiente clase:

public class AutorizacionModel

    {

        public static Boolean  ObtIPAutorizadas(String ip)

        {

            var ips = new List<string>();

            ips.Add("127.0.0.1");

            ips.Add("::1");

            return ips.Contains(ip);

        }

    }

Como puedes ver, esta función devuelve verdadero o falso si es que la IP que entra como argumento está dentro de la lista de IPs, en este caso agrego la dirección loopback 127.0.0.1 (IPV4)  y ::1 que es la loopback de IPv6.

Luego creamos un Filtro que herede de ActionFilterAtribute:

public class FiltroIPAttribute: ActionFilterAttribute

{

  public override void OnActionExecuting(HttpActionContext actionContext)

   {

     var context = actionContext.Request.Properties["MS_HttpContext"] as
                                                 System.Web.
HttpContextBase
;

     string ip = context.Request.UserHostAddress;

     if (!AutorizacionModel.ObtIPAutorizadas(ip)){

         actionContext.Response = new HttpResponseMessage
                                      (System.Net.
HttpStatusCode
.Forbidden)

          {

               Content = new StringContent("IP NO AUTORIZADA")

          };

           return;

       }

   }

}

En este filtro obtenemos la IP del cliente que esta haciendo la petición en el Web API, luego vamos a poder determinar si la IP está dentro de la lista llamando al método del Modelo  que habíamos comentado anteriormente. En el caso que no exista dentro de la lista, enviamos un mensaje HttpStatusCode.Forbidden (Prohibido).

Luego lo único que nos falta es agregar el Filtro en el Global.asax

GlobalConfiguration.Configuration.Filters.Add(new FiltroIPAttribute());

Y estamos listos, vamos a probar ahora , con una IP que no está en la lista, y veremos:

image

Tenemos el mensaje IP NO AUTORIZADA  y el código de error 403 de prohibido, es decir, funcionando como queríamos.

 

Espero que te sea de utilidad

@chalalo

[Tips] ASP.NET Web API- Detectando HTTPS

Hola, vamos a ver rápidamente un tip que encuentro de bastante utilidad para determinar si nuestra web api se está ejecutando en un entorno seguro, al menos a nivel de https. Lo anterior lo vamos a lograr mediantes los customfilters, puedes ver un tutorial de Stephen Walther acá http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx para revisar el tema de los filtros.

Entonces vamos a crear el Filtro , al que he llamado VerificaHttpsAttribute: 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net.Http;

using System.Web;

using System.Web.Http.Controllers;

using System.Web.Http.Filters;

 

namespace WebAPITest

{

    public class VerificaHttpsAttribute : ActionFilterAttribute

    {

     public override void OnActionExecuting(HttpActionContext actionContext)

     {

        if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https",
             StringComparison
.OrdinalIgnoreCase))

         {

          actionContext.Response = new HttpResponseMessage
                                      (System.Net.
HttpStatusCode
.BadRequest)

           {

               Content = new StringContent("Se requiere HTTPS")

            };

                return;

            }

        }

    }

Como vez, se hace la comparación sobre el string https que viene en el RequestURI.Scheme para determinar si se está ejecutando la Web API en una conexión segura.

Luego hay que agregar este filtro global al global.asax , de manera de no agregarlo por contraolador, por lo que vamos agregar:

GlobalConfiguration.Configuration.Filters.Add(new VerificaHttpsAttribute());

Y listo, ahora si ejecutamos la aplicación:

image

 

Y como no estamos en un ambiente https, nos envía la información Sonrisa

Eso!, nos vemos en el siguiente articulo.

Saludos,
@chalalo

VS2012–Zend Coding en nuestro Visual Studio 2012 :)

image

Esta es una muy buena noticia, algo que otros editores ya incluían nativamente o como plugin,  tales como Notepad++  o Sublime entre otros,  que es el Zend Coding, que es una sintaxis que nos permite generar  de mucho más rápido código  HTML/XML/XSL. Puedes revisar más documentación sobre Zend Coding acá http://code.google.com/p/zen-coding/.

Y ahora es el turno de Visual Studio 2012, en el cual podemos instalarle esta característica como parte del Web Essentials 2012 desde acá http://visualstudiogallery.msdn.microsoft.com/07d54d12-7133-4e15-becb-6f451ea3bea6

Una vez instalado podemos probarlo, voy a crear una nueva página HTML, y vamos a generar una lista no ordenada:

<!DOCTYPE html>

<html lang=”en” xmlns=”http://www.w3.org/1999/xhtml”>

<head>

    <meta charset=”utf-8″ />

    <title></title>

</head>

<body>

    <!– Escribe esto y apreta Tab al final –>

    ul[data-bind=”foreach:personas”]>li*4>span{Persona $$}

 

    <!– Obtienes esto –>

    <ul data-bind=”foreach:personas”>

        <li><span>Persona 01</span></li>

        <li><span>Persona 02</span></li>

        <li><span>Persona 03</span></li>

        <li><span>Persona 04</span></li>

    </ul>

</body>

</html>

Podemos concatenar algunas combinaciones interesantes que  si las dominamos, pueden acelerar nuestra escritura de código, por ejemplo si necesito un botón con Id, clase css, values y con un atributo customizado, podemos escribir (recuerda presionar la tecla tab al final):

button[data-icon=”gear”]#IdBoton.clase{Titulo Boton}

y obtendremos lo siguiente:

<button id=”IdBoton” data-icon=”gear” class=”clase”>Titulo Boton</button>

Sigamos con los ejemplos, si necesitamos crear un elemento input con ciertas propiedades, dentro de un div que se llama datos, dentro de un footer, escribimos:

  footer>div#datos>input[placeholder=”IngreseNombre” type=”text” required=true].csstexto

Obtenemos:

<footer>

   <div id=”datos”>

      <input type=”text” value=”” placeholder=”IngreseNombre”
           
 required=”true” class=”csstexto”
/>

    </div>

 </footer>

Muy bueno!, pero hay muchos más ejemplos que podemos revisar, mira está página para que veas posibilidades interesantes.

http://www.johnpapa.net/zen-coding-in-visual-studio-2012/

Puedes buscar más información en :

Saludos

@chalalo