none
ayuda al crear cookie con c# mvc y validar si el usuario inicio session. RRS feed

  • Pregunta

  • Que tal amigos recurro a ustedes para lo siguiente, resulta que tengo una clase para poder crear una cookie con los datos del usuario que se loguea en mi aplicación para ser exactos lo hago en el controlador de accountcontroller de esta manera.

     public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
            {
                           
                if (!ModelState.IsValid)
                {
                    return View(model);
                }
    
                // No cuenta los errores de inicio de sesión para el bloqueo de la cuenta
                // Para permitir que los errores de contraseña desencadenen el bloqueo de la cuenta, cambie a shouldLockout: true
                var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
                switch (result)
                {
                    case SignInStatus.Success:
                         Logo(model);//codigo para obtener la imagen del usuario
                        SessionHelper.AddUserToSession(model.Email,model.RememberMe); //Agrego Usuario al Session
                        var usuario = db.MtoUsuarios.Where(u => u.UserName == model.Email).FirstOrDefault();
                        SessionHelper.ActualizarSession(usuario);//Actualizo Session
                        if (returnUrl != null)
                        {
                            return Json(returnUrl, JsonRequestBehavior.AllowGet);
                        }
                        else                       
                        strMensaje = Url.Content("~/Home/Index");
                        return Json(new Response { succeeded = true, Message = strMensaje,Id=id}, JsonRequestBehavior.AllowGet);
                    case SignInStatus.LockedOut:
                        return View("Lockout");
                    case SignInStatus.RequiresVerification:
                        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
                    case SignInStatus.Failure:
                    default:
                        ModelState.AddModelError("", "Intento de inicio de sesión no válido.");
                        //return View(model);
    
                        return Json(new Response { succeeded = false }, JsonRequestBehavior.AllowGet);
                }
            }
    

    Ahora bien la clase de nombre SessionHelper contiene el siguiente codigo.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using WebDBT.Models;
    
    namespace WebDBT.Helpers
    {
        public class SessionHelper
        {
            private static WebDBTContext db = new WebDBTContext();
    
            public static bool ExistUserInSession()
            {
                return HttpContext.Current.User.Identity.IsAuthenticated;
            }
    
            public static void DestroyUserSession()
            {
                FormsAuthentication.SignOut();
            }
    
            public static int GetUser()
            {
                int user_id = 0;
                if (HttpContext.Current.User != null && HttpContext.Current.User.Identity is FormsIdentity)
                {
                    FormsAuthenticationTicket ticket = ((FormsIdentity)HttpContext.Current.User.Identity).Ticket;
                    if (ticket != null)
                    {
                        user_id = Convert.ToInt32(ticket.UserData);
                    }
                }
    
                return user_id;
            }
    
            public static void AddUserToSession(string id, bool persist)
            {
                var cookie = FormsAuthentication.GetAuthCookie("UserWebDBT", persist);
    
                cookie.Name = FormsAuthentication.FormsCookieName;
                cookie.Expires = DateTime.Now.AddMonths(1);
    
                var ticket = FormsAuthentication.Decrypt(cookie.Value);
    
                var user = db.MtoUsuarios.Where(u => u.UserName.ToUpper() == id.ToUpper()).FirstOrDefault();
    
                var newTicket = new FormsAuthenticationTicket(
                                ticket.Version,
                                 ticket.Name,
                                 ticket.IssueDate,
                                 ticket.Expiration,
                                 ticket.IsPersistent, Convert.ToString(user.MtoUsuarioId));
    
                cookie.Value = FormsAuthentication.Encrypt(newTicket);
                HttpContext.Current.Response.Cookies.Add(cookie);
              
            }
    
            public static void ActualizarSession(MtoUsuario Usuario)
            {
                HttpContext.Current.Session["UsuarioId"] = Usuario.MtoUsuarioId;
                HttpContext.Current.Session["CorreoElectronico"] = Usuario.UserName;
                HttpContext.Current.Session["EmpresaId"] = Usuario.MtoCompaniaId;
                HttpContext.Current.Session["Rol_Id"] = Usuario.MtoUsuarioId;
                HttpContext.Current.Session["Nombres"] = Usuario.FullName;
            }
    
        }
    }

    pero cuando entra a este código al agregar la cookie en la linea

      HttpContext.Current.Response.Cookies.Add(cookie);

    y el error que me  manda es el siguiente

    Bienvenido
    Iniciar Sesion
    
    ¿Recordar cuenta?
    ¿Ha olvidado su contraseña?
    
    No se puede conectar al servidor, intentelo más tarde!<!DOCTYPE html>
    <html>
    <head>
    <title>Referencia a objeto no establecida como instancia de un objeto.</title>
    <meta name="viewport" content="width=device-width" />
    <style>
    body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
    p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
    b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
    H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
    H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
    pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt}
    .marker {font-weight: bold; color: black;text-decoration: none;}
    .version {color: gray;}
    .error {margin-bottom: 10px;}
    .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
    @media screen and (max-width: 639px) {
    pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
    }
    @media screen and (max-width: 479px) {
    pre { width: 280px; }
    }
    </style>
    </head>
    
    <body bgcolor="white">
    
    <span><H1>Error de servidor en la aplicación '/'.<hr width=100% size=1 color=silver></H1>
    
    <h2> <i>Referencia a objeto no establecida como instancia de un objeto.</i> </h2></span>
    
    <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
    
    <b> Descripción: </b>Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.
    
    <br><br>
    
    <b> Detalles de la excepción: </b>System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.<br><br>
    
    <b>Error de código fuente:</b> <br><br>
    
    <table width=100% bgcolor="#ffffcc">
    <tr>
    <td>
    <code><pre>
    
    Línea 56:
    Línea 57: cookie.Value = FormsAuthentication.Encrypt(newTicket);
    <font color=red>Línea 58: HttpContext.Current.Response.Cookies.Add(cookie);
    </font>Línea 59:
    Línea 60: }</pre></code>
    
    </td>
    </tr>
    </table>
    
    <br>
    
    <b> Archivo de origen: </b> C:\Users\Mirobiano\Source\Repos\WebDBT\WebDBT\Helpers\SessionHelper.cs<b> &nbsp;&nbsp; Línea: </b> 58
    <br><br>
    
    <b>Seguimiento de la pila:</b> <br><br>
    
    <table width=100% bgcolor="#ffffcc">
    <tr>
    <td>
    <code><pre>
    
    [NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.]
    WebDBT.Helpers.SessionHelper.AddUserToSession(String id, Boolean persist) in C:\Users\Mirobiano\Source\Repos\WebDBT\WebDBT\Helpers\SessionHelper.cs:58
    WebDBT.Controllers.&lt;Login&gt;d__13.MoveNext() in C:\Users\Mirobiano\Source\Repos\WebDBT\WebDBT\Controllers\AccountController.cs:103
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
    System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +97
    System.Web.Mvc.Async.&lt;&gt;c__DisplayClass37.&lt;BeginInvokeAsynchronousActionMethod&gt;b__36(IAsyncResult asyncResult) +17
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
    System.Web.Mvc.Async.AsyncInvocationWithFilters.&lt;InvokeActionMethodFilterAsynchronouslyRecursive&gt;b__3d() +50
    System.Web.Mvc.Async.&lt;&gt;c__DisplayClass46.&lt;InvokeActionMethodFilterAsynchronouslyRecursive&gt;b__3f() +228
    System.Web.Mvc.Async.&lt;&gt;c__DisplayClass33.&lt;BeginInvokeActionMethodWithFilters&gt;b__32(IAsyncResult asyncResult) +10
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
    System.Web.Mvc.Async.&lt;&gt;c__DisplayClass2b.&lt;BeginInvokeAction&gt;b__1c() +26
    System.Web.Mvc.Async.&lt;&gt;c__DisplayClass21.&lt;BeginInvokeAction&gt;b__1e(IAsyncResult asyncResult) +100
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
    System.Web.Mvc.Controller.&lt;BeginExecuteCore&gt;b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
    System.Web.Mvc.Controller.&lt;BeginExecute&gt;b__15(IAsyncResult asyncResult, Controller controller) +12
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
    System.Web.Mvc.MvcHandler.&lt;BeginProcessRequest&gt;b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
    System.Web.CallHandlerExecutionStep.InvokeEndHandler(IAsyncResult ar) +152
    System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +125
    </pre></code>
    
    </td>
    </tr>
    </table>
    
    <br>
    
    <hr width=100% size=1 color=silver>
    
    <b>Información de versión:</b>&nbsp;Versión de Microsoft .NET Framework:4.0.30319; Versión ASP.NET:4.7.3282.0
    
    </font>
    
    </body>
    </html>
    <!--
    [NullReferenceException]: Referencia a objeto no establecida como instancia de un objeto.
    en WebDBT.Helpers.SessionHelper.AddUserToSession(String id, Boolean persist) en C:\Users\Mirobiano\Source\Repos\WebDBT\WebDBT\Helpers\SessionHelper.cs:línea 58
    en WebDBT.Controllers.AccountController.<Login>d__13.MoveNext() en C:\Users\Mirobiano\Source\Repos\WebDBT\WebDBT\Controllers\AccountController.cs:línea 103
    --- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---
    en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    en System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.<BeginInvokeAction>b__1c()
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
    en System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
    en System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
    en System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
    en System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
    en System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
    en System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)
    en System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
    en System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
    en System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
    en System.Web.HttpApplication.CallHandlerExecutionStep.InvokeEndHandler(IAsyncResult ar)
    en System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)
    -->
    !
    
    Not valid!
    

    quiera saber si me pueden ayudar para agregar la cookie, o en su caso modificar la cookie que general la aplicacion automaticamente para poder traer los datos del usuario que se logueo, por su ayuda muchas gracias.




    Horacio Xochitemol Bautista

    viernes, 19 de abril de 2019 12:39