Autenticación de formularios entendiendo context.user.identity

Dado que la documentación de este proceso es muy vaga y confusa (o antigua), quería verificar que lo estaba haciendo correctamente y que no faltaba ningún paso.

Intento crear un sistema de inicio de sesión seguro que caduque al cerrar el navegador.

– en mi web.config tengo lo siguiente –

       

Así que tengo un formulario de inicio de sesión con el nombre de usuario / caja de texto de la contraseña y este botón:

  

Dentro de Login_Authenticate hago lo siguiente:

 protected void Login_Authenticate(object sender, EventArgs e){ string userName = UserName.Text; string password = Password.Text; bool Authenticated = false; // Here's code that makes sure that Username and Password is CORRECT if(AuthClass.Authenticate(userName, password)){ Authenticated = true; } // error checking does happen here. if (Authenticated) { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(30), rememberUserName, String.Empty, FormsAuthentication.FormsCookiePath); string encryptedCookie = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedCookie); cookie.Expires = DateTime.Now.AddMinutes(30); Response.Cookies.Add(cookie); //FormsAuthentication.RedirectFromLoginPage(userName, false); Response.Redirect("MainPage.aspx"); } } 

— en MasterPage.master.cs tengo el siguiente control en Page_Init () —

 if (Context.User.Identity.IsAuthenticated) { int userid = (int)Session["userid"]; if (userid == null) { userid = GetUserID(Context.User.Identity.Name); if (userid != null) { Session["userid"] = userid; } } } 

EDITAR: — GLOBAL.ASAX; algún código del que no estoy seguro es correcto o sabe lo que hace

 protected void Application_AuthenticateRequest(object sender, EventArgs e) { // look if any security information exists for this request if (HttpContext.Current.User != null) { // see if this user is authenticated, any authenticated cookie (ticket) exists for this user if (HttpContext.Current.User.Identity.IsAuthenticated) { // see if the authentication is done using FormsAuthentication if (HttpContext.Current.User.Identity is FormsIdentity) { // Get the roles stored for this request from the ticket // get the identity of the user FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; //Get the form authentication ticket of the user FormsAuthenticationTicket ticket = identity.Ticket; //Get the roles stored as UserData into ticket string[] roles = { }; //Create general prrincipal and assign it to current request HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(identity, roles); } } } } 

— A partir de ese momento, en cada página, uso el ID de usuario Session para recostackr la información y el contenido del usuario y me aseguro de que el usuario tenga la autenticación adecuada y los permisos de roles de grupo.

¿Esto es todo correcto? ¿O tengo que descifrar algo en alguna parte?

¿Es esto suficiente para hacer un inicio de sesión de usuario seguro? ¿O no debería molestarme con la autenticación de formularios y encontrar mi propia forma de hacer mis propias cookies y gestionarlas yo mismo?

La forma en que su código está escrito inicia sesión en las sesiones del navegador. Podría ayudar a comprender los conceptos básicos de lo que está sucediendo.

Para los métodos de autenticación basados ​​en cookies, existen realmente tres acciones:

1) Inicio de sesión: valida las credenciales del usuario y crea y almacena una cookie en su navegador.

2) Logout: simplemente elimina la cookie del navegador (caducando la cookie o eliminándola)

3) Validación por solicitud (la parte que es su Application_AuthenticateRequest): verifique si existe una cookie y, de ser así, obtenga la Identidad y las funciones del usuario y configure HttpContext.Current.User.

Normalmente, el módulo FormsAuthentication oculta la mayor parte de esto. Parece que su código está tratando de usar algunos de los elementos de FormAuthentication (como FormsAuthenticationTicket y FormsIdentity. Esto está bien siempre que obtenga lo que desea.

Su método Login_Authenticate se ve bien EXCEPTO que está estableciendo un vencimiento en la cookie. Esto hará que la cookie persista incluso si cierra y vuelve a abrir el navegador. Como este no es el comportamiento que desea, no establecería una caducidad de cookies. Establecer esto es como marcar la casilla “recordarme”.

El código en Application_AuthenticateRequest se ejecuta cada vez que se sirve una página desde su aplicación. Su trabajo principal es establecer HttpContext.Current.User. Normalmente, si ningún usuario ha iniciado sesión, el usuario es nulo o un usuario anónimo. Si un usuario está conectado, esto debería representar a su usuario.

Si está haciendo estas tres cosas, en cualquier lugar de su código puede hacer referencia a HttpContext.Current.User para decidir qué nivel de información desea mostrar. Por ejemplo, si desea restringir una página solo a administradores, puede llamar a HttpContext.Current.Users.IsInRole (“Administrators”) y redirigirlos fuera de la página si la llamada devuelve false.

Espero que esto ayude.

Estoy un poco retrasado en el tema, pero para aquellos que intentan implementar la autenticación de formularios a la vez que simplifican las cosas (como yo estaba intentando), aquí la documentación relevante más reciente que he encontrado en msdn: http://msdn.microsoft.com /en-us/library/xdt4thhy(v=vs.100).aspx

En resumen, no se equivoque al establecer cookies, verificarlas, crear instancias de tickets o el principal, … Déjelo en la clase FormsAuthentication .

Al iniciar sesión, cuando su código tenga credenciales de verificación y si son válidas, simplemente llame

 FormsAuthentication.RedirectFromLoginPage(yourUserId, false); 

Establece la cookie de autenticación para usted, que, combinada con la redirección, es suficiente. El ” false ” es por no continuar la autorización: se perderá al cerrar el navegador (o el tiempo de espera de la autorización).

En una solicitud ya autenticada, no hay nada que verificar por código para garantizar que su autenticación sea válida. Use Context.User.Identity.Name para saber quién está conectado (sería la cadena yourUserId anterior).

En cierre de sesión explícito, llame

 FormsAuthentication.SignOut(); FormsAuthentication.RedirectToLoginPage(); 

Y tiene la autenticación de formularios configurada en web.config.

          

Tenga en cuenta que para las aplicaciones MVC, la parte de autorización debe eliminarse de la configuración y manejarse con AuthorizeAttribute registrado como un atributo de filtro global, con el uso de AllowAnonymousAttribute en los controladores o las acciones que lo necesiten. (MVC 4; antes de este, se requería crear sus propios atributos para manejar eso).

Hay un problema en su etiqueta de autorización, debe ser:

     

porque quieres negar usuarios anónimos Si soluciona esto, puede eliminar de manera segura todo el material de la página maestra y global.asax; no es necesario reasignar la identidad de los formularios a su propia identidad personalizada almacenada en la sesión. Es el desperdicio de recursos y no creo que aumente la seguridad de su solución de manera significativa. Puede confiar en la cookie de formularios.

El flujo de trabajo completo para Remember Me requiere: 1. Escribir datos personalizados en la cookie. 2. Lea los datos personalizados.

Incluso si puede autenticar una solicitud a través de una cookie, no significa que un objeto HttpSession sea reanudable para esa solicitud.

http://www.codeproject.com/Articles/779844/Remember-Me

enter image description here