Seguridad en MVC 4 Parte I

Hay tres tipos de seguridad que podemos aplicar:

Autenticación Formularios
Autenticación Windows
Autenticación oAuth / OpenID

Autenticación Formularios

Crearemos un formulario típico de lógin y aplicaremos lo necesario para comprobar la identidad del usuario en nuestra base de datos. Este modo nos permite crear contraseñas fuertes y personalizables. Se gestiona internamente con cookies con lo cuál se guardan el login en el navegador y tampoco es necesario que tengan que logarse todo el rato. Lo costoso es que requiere SSL o acceso HTTPs para evitar el envío de contraseñas sin cifrar a través de la red.

 

oAuth OpenID

Implica que nuestro sistema no almacena la contraseña del usuario. Esto se hace confiando en sitios de terceros, como Twitter, Facebook, etc, que son quienes realizan el login y nos pasan la información necesaria. Se denominan 3rd Party Identity Providers y nos evitan la gestión de credenciales.

 

Autenticación Windows

También llamada integrada y Single Sign On. Usada en Intranets, ya que la validación es con el propio usuario de la sesión de Windows, dentro de un dominio tras el firewall y con un servidor de directorio activo.

Es cómodo  ya que el usuario no tiene que logarse en la aplicación y además permite acceso a recursos compartidos de red, impresoras, etc.

 

Ejemplo con autenticación Windows

Hay que crear un proyecto MVC, de tipo Intranet. Despues en las propiedades del proyecto F4,  permitir Autenticación de Windows.

propiedades

Si ejecutamos, el navegador nos solicitará nuestras credenciales de Windows. ¿Por qué pide credenciales si estamos en una intranet y debería coger automaticamente nuestro usuario de Windows? Esto sucede porque IE pide las credenciales si considera que no estás en la intranet. No reconoce localhost como parte de la intranet y debemos añadirla para que la validación sea automática.

Por tanto, hay que ir a IE, Herramientas, Opciones de Internet, Seguridad, Intranet Local  y luego en Sitios, Opciones Avanzadas y añadir LocalHost.

localhostTras esto, ya no nos pedirá login y podremos acceder a la información del usuario.

Se puede mostrar el nombre del usuario en una vista con : Soy: @User.Identity.Name
También podemos ver el tipo de Autenticación con @User.Identity.AuthenticationType o si está o no autenticado con: @User.Identity.IsAuthenticated

En este modo de autenticación, el WebConfig presentará una línea como esta:

 

 <authentication mode="Windows" /> 

 

Crear un grid de cinco columnas combinable con Bootstrap 3

Bootstrap trabaja con un grid de 12 columnas, pero en ocasiones podemos necesitar crear 5 columnas, por lo tanto lo más adecuado sería un grid de 15 columnas que podemos definirnos de la siguiente manera.

    .colfive-1  {width: 6.66%;   float: left;}
    .colfive-2  {width: 13.33%;  float: left;}
    .colfive-3  {width: 20%;     float: left;}
    .colfive-4  {width: 26.66%;  float: left;}
    .colfive-5  {width: 33.33%;  float: left;}
    .colfive-6  {width: 40%;     float: left;}
    .colfive-7  {width: 46.66%;  float: left;}
    .colfive-8  {width: 53.33%;  float: left;}
    .colfive-9  {width: 60%;     float: left;}
    .colfive-10 {width: 66.66%;  float: left;}
    .colfive-11 {width: 73.33%;  float: left;}
    .colfive-12 {width: 80%;     float: left;}
    .colfive-13 {width: 86.66%;  float: left;}
    .colfive-14 {width: 93.33%;  float: left;}
    .colfive-15 {width: 100%;    float: left;}

Evitar validación de formulario al pulsar ENTER

Otra situación incómoda que puede producirse, es que cuando estemos en una caja de texto en un formulario, al pulsar ENTER, automaticamente se active el submit y se reenvíe el formulario. Es un destrozo por ejemplo si estamos trabajando en un textbox multilínea.

Para evitar esto, el formulario tiene un botón por defecto asociado, que es el que se activa cuando cualquier control ejecuta una validación. Si no se asocia ninguno, por defecto realiza un submit. Debemos indicarle por tanto un botón dentro del formulario, al que redirigir estas acciones. Pero como dicho botón no debe hacer nada, debe ser invisible y no tener eventos asociados.

 

<form id="form1" runat="server" defaultbutton="NoHagasNada">
...
...

<asp:Button ID="NoHagasNada" runat="server" Enabled="false" Style="display: none;" />

Evitar validación en botón Cancelar

Cuando tenemos un formulario on controles de validación, esto impide que por ejemplo se envíen campos vacios u otro tipo de restricciones. Esta es la acción predeterminada cuando pulsamos en el botón Enviar. Pero, por defecto, si tenemos un botón de Cancelar, para salir de esa pantalla, vemos que la validación se lanza igualmente.

Entonces a ese botón tenemos que indicarle que no queremos que haga ningún tipo de validación, y lo hacemos asignando la propiedad CausesValidation a False.

<asp:Button ID="btnCrear" runat="server" 
    OnClick="btnCrear_Click" 
    Text="Crear" />

<asp:Button ID="btnCancelar" runat="server" 
    OnClick="btnCancelar_Click" 
    Text="Cancelar" 
    CausesValidation="False" />