jueves, 9 de agosto de 2018

Unable to cast object of type 'System.Security.Principal.WindowsPrincipal' to type

Unable to cast object of type 'System.Security.Principal.WindowsPrincipal' to type

Estuve buscando sobre este error y parece que puede ocurrir en diferentes escenarios sin embargo el problema está relacionado con el tipo de autenticación que estén usando en su aplicación web.



Hay diferentes formas de manejar la autenticación en una aplicación web y una de ellas es windows authentication, forms authentication, etc 

Mi particular escenario es tener una aplicación web que usa Forms authentication. Es decir que tengo mi formulario de login y hago mi validación con base de datos, para esto utilizo una clase personalizada y por motivos de seguridad he activado la opción windows authentication a nivel de IIS.

IIS windows authentication
IIS windows authentication
Obtengo el error al cambiar el tipo de Authentication en IIS de un sitio web de Anonymous authentication a Windows authentication 

El error exacto en mi código es en la asignación del usuario, ya que la validación en el if es correcto:

@if (User.Identity.IsAuthenticated)
{
namespace.Models.Usuario u=mynamespace.Models.MyModel.usuario;
if (usuario != null)
{

La clase Identity es una clase reservada para identificar a un usuario dentro de la aplicación web y al parecer esta cambia al hacer el cambio en IIS a windows authentication
Por esta razón es necesario hacer otra validación en el if antes de hacer una asignación de objetos de seguridad errónea.

En mi caso el error se arregla agregando esta validación en mi if para FormsIdentity y en cualquier lugar donde use alguna clase de este tipo.

@if (User.Identity.IsAuthenticated && User.Identity is FormsIdentity)


Espero les sirva.




Poner seguridad en un sitio de IIS con un usuario de windows

Como poner seguridad en un sitio de IIS con un usuario de Windows

En ocasiones es necesario no mostrar el contenido de un sitio web por razones de seguridad, privacidad, alguna estrategia de marketing o ninguna razón en específico.

Cuando se necesita asegurar un sitio con credenciales de usuario se puede utilizar un usuario y password de una cuenta  de windows con lo que se facilita la administración de la seguridad del sitio.

En IIS poner seguridad es una cuestión de configuración del sitio. Esto puede hacerse de una manera sencilla utilizando una cuenta de windows del mismo servidor.

Aquí muestro los pasos para ligar la seguridad de un usuario de windows a un sitio web en IIS.

1. Abrir IIS
2. Seleccionar el sitio web a modificar
3. Seleccionar la opción Authentication


4. Desactivar la opción Anonymous Authentication. Esto deshabitará que el contenido del sitio pueda ser accedido por cualquier persona.

5. Activar la opción Windows Authentication. Inmediatamente después de hacer esto el sitio web va a solicitar credenciales de windows cuando se intente acceder a través de un navegador de internet. Esto permitiría entrar al sitio con alguna cuenta de windows con los permisos requeridos.




6. Si no tienes el usuario, créalo en: Aministrative Tools > Computer management



7. Seleccionar el sitio web, click derecho Edit permissions. Seleccionar el tab Security y la opción de Editar para agregar al usuario deseado. Los permisos dependen de qué es lo que necesitas. Lo ideal es sólo lectura pero en mi caso voy a requerir que se realizan algunas tareas de ejecución así que dejaré valores por defecto.


8. Una vez hecho esto dar click en Aceptar y probar que podamos entrar con el usuario.

Dependiendo de la clase de contenido que estén mostrando dependerán los permisos que requieren otorgar.

Siempre es recomendado otorgar únicamente los permisos que el usuario requiere y no más. Así que definir estos es tarea del administrador.

Espero les sirva.