1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

System.NullReferenceException ao tentar recuperar informações do Cookie

Estou com seguinte erro:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: Line 43: Line 44: // Get the custom user data encrypted in the ticket. Line 45: string userData = ((FormsIdentity)(Context.User.Identity)).Ticket.UserData;

Global.asax

namespace Blog
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            BundleConfig.RegisterBundles(BundleTable.Bundles);
            Database.SetInitializer<BlogContext>(new Blog.Models.BlogContext.DropCreateifChangeInitializer());
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);           
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                // Pega o forms com ticket autenticado.
                FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
                var identity = new GenericIdentity(authTicket.Name, "Forms");
                var principal = new MyPrincipal(identity);

                // Pega a informação do usuário costumizado
                string userData = ((FormsIdentity)(Context.User.Identity)).Ticket.UserData;

                // Descerializo e coloco no principal costumizado.
                var serializer = new JavaScriptSerializer();
                principal.User = (Usuario)serializer.Deserialize(userData, typeof(Usuario));

                // Set the context user.
                Context.User = principal;
            }
        }
    }
}
`

Método responsável por fazer o ticket

public static bool ValidateUser(UsuarioLogin usuario, HttpResponseBase response)
{
    bool result = false;

    if (Membership.ValidateUser(usuario.email, usuario.senha))
    {
        // Cria o ticket autenticado com as informações do usuário.
        var serializer = new JavaScriptSerializer();
        string userData = serializer.Serialize(UsuarioRepositorio.User);

        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                usuario.email,
                DateTime.Now,
                DateTime.Now.AddDays(30),
                true,
                userData,
                FormsAuthentication.FormsCookiePath);

        // Encrypto ticket 
        string encTicket = FormsAuthentication.Encrypt(ticket);

        // Crio o cookie
        response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

        result = true;
    }
    return result;
}
public static Usuario User 
{
    get
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            // O usuário está autenticado. E então retorno o usuário do forms auth ticket.
            return ((MyPrincipal)(HttpContext.Current.User)).User;
        }
        else if (HttpContext.Current.Items.Contains("User"))
        {
            // O usuário não está autenticado mas logou normalmente.
            return (Usuario)HttpContext.Current.Items["User"];
        }
        else
        {
            return null;
        }
    }
}

Qualquer informação que me leve a solução do fato de eu não estar conseguindo recuperar as informações do usuário do Cookie são bem vindas.

string userData = ((FormsIdentity)(Context.User.Identity)).Ticket.UserData;

Na linha acima está dando System.NullReferenceException mas como vocês podem ver o método está criando o Cookie com as informações.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags c# asp.net-mvc cookies ou faça a sua própria pergunta.