¿Cómo puedo crear manualmente una cookie de autenticación en lugar del método predeterminado?

Usando FormsAuthentication escribimos código como este:

  if (IsValidUser()) { FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie); } 
  1. ¿Cómo puedo crear manualmente una cookie de autenticación en lugar de escribir FormsAuthentication.SetAuthCookie(userName, createPersistentCookie) ?

  2. ¿Cómo puedo almacenar una URL de redireccionamiento desde la página de inicio de sesión en una variable de cadena en lugar de escribir FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie) ?

Aqui tienes. ASP.NET se ocupa de esto cuando utiliza los métodos de nivel superior integrados en FormsAuthentication, pero en el nivel bajo esto es necesario para crear una cookie de autenticación.

 if (Membership.ValidateUser(username, password)) { // sometimes used to persist user roles string userData = string.Join("|",GetCustomUserRoles()); FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, // ticket version username, // authenticated username DateTime.Now, // issueDate DateTime.Now.AddMinutes(30), // expiryDate isPersistent, // true to persist across browser sessions userData, // can be used to store additional user data FormsAuthentication.FormsCookiePath); // the path for the cookie // Encrypt the ticket using the machine key string encryptedTicket = FormsAuthentication.Encrypt(ticket); // Add the cookie to the request to save it HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); cookie.HttpOnly = true; Response.Cookies.Add(cookie); // Your redirect logic Response.Redirect(FormsAuthentication.GetRedirectUrl(username, isPersistent)); } 

No estoy seguro de por qué querrías hacer algo personalizado aquí. Si desea cambiar la implementación de dónde se almacenan los datos del usuario y cómo se autentican los usuarios, se recomienda crear un Proveedor de MembershipProvider personalizado. Hacer rodar tu propia solución y jugar con la cookie de autenticación significa una alta probabilidad de introducir agujeros de seguridad en tu software.

No entiendo tu parte 2. Solo tienes que llamar a FormsAuthentication.GetRedirectUrl si quieres devolver a los usuarios a la página a la que intentaron acceder cuando se les devolvió el boton para iniciar sesión. Si no haces lo que quieras aquí, redirige a una url almacenada en la configuración si quieres.

Para leer la cookie FormsAuthentication, normalmente conectaría el evento AuthenticateRequest en un HttpModule o Global.asax y configuraría el contexto IPrinciple del usuario.

 protected void Application_AuthenticateRequest(Object sender, EventArgs e) { HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; if(authCookie != null) { //Extract the forms authentication cookie FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); // If caching roles in userData field then extract string[] roles = authTicket.UserData.Split(new char[]{'|'}); // Create the IIdentity instance IIdentity id = new FormsIdentity( authTicket ); // Create the IPrinciple instance IPrincipal principal = new GenericPrincipal(id, roles); // Set the context user Context.User = principal; } } 

la otra forma de crear una cookie,

 HttpCookie toolCookie = new HttpCookie("xyz"); toolCookie["UserName"] = userName; toolCookie["Password"] = StringCipher.Encrypt(password, "#!"); toolCookie.Expires = DateTime.Now.AddMinutes(chkRemember.Checked ? 30 : -30); Request.Cookies.Add(toolCookie); 

Referencia

Obtenga los detalles de la cookie existente

 HttpCookie user = Request.Cookies["xyz"]; if(user != null) { string username = user["UserName"]; string password = user["Password"] != null ? StringCipher.Decrypt(user["Password"], "#!") } 

aquí Datasecurity es una clase estática.

Función de cifrado y descifrado Cifrar y descifrar