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 |
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.