2011-08-27 6 views
46

Usando FormsAuthentication escribimos código como este:¿Cómo puedo crear manualmente una cookie de autenticación en lugar del método predeterminado?

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 ?

  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)?

Respuesta

81

Aquí 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ía 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 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 su parte 2. Solo necesita llamar a FormsAuthentication.GetRedirectUrl si desea devolver a los usuarios a la página a la que estaban intentando acceder cuando se les devolvió el inicio de 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 de usuario IPrinciple.

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; 
    } 
} 
+0

ur respuesta me ayuda ... puede u por favor, qué código que necesito escribir para leer el contenido de la cookie de autenticación después de la autenticación. FormsAuthentication.SetAuthCookie (userName, createPersistentCookie); SetAuthCookie crear una cookie de autenticación y tengo que escribir el contenido de esa cookie desde el lado del servidor? puedes ayudar por favor thnx. :) – Thomas

+0

¿podemos crear una cookie de autenticación de formulario desde el lado del cliente utilizando jquery? – Thomas

+3

He actualizado para mostrar también cómo también puede leer la cookie. No, no puede configurar esto desde el lado del cliente, ya que sería un riesgo de seguridad y no podría realizar el cifrado que requiere claves del lado del servidor. La cookie de autenticación siempre debe ser HttpOnly. La única forma sería realizar una solicitud de AJAX y dejar que la cookie se establezca en el lado del servidor, en cuyo caso debe asegurarse de que está pasando credenciales a través de SSL. – TheCodeKing

-7

la otra manera 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); 

Reference

Obtenga los detalles de galletas existentes

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.

cifrar y descifrar la función Encrypt & Decrypt

+10

Nunca coloque la contraseña en una cookie. Esto vence todo el punto de las cookies seguras –

+0

¿podría sugerirme una solución óptima para el mismo – Vijayaraghavan

+0

? Puede comprobar este ejemplo .. http://www.aspsnippets.com/Articles/Implement-Remember-Me-functionality-using-CheckBox- ASPNet.aspx – Vijayaraghavan

Cuestiones relacionadas