Como posso criar manualmente um cookie de autenticação em vez do método padrão?

Usando FormsAuthentication , escrevemos código como este:

  if (IsValidUser()) { FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie); } 
  1. Como posso criar manualmente um cookie de autenticação em vez de escrever FormsAuthentication.SetAuthCookie(userName, createPersistentCookie) ?

  2. Como posso armazenar um URL de redirecionamento da página de login em uma variável de string em vez de gravar FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie) ?

Aqui está. O ASP.NET cuida disso quando você usa os methods de nível superior criados em FormsAuthentication, mas no nível baixo isso é necessário para criar um cookie de autenticação.

 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)); } 

Não sei por que você gostaria de fazer algo personalizado aqui. Se você quiser alterar a implementação de onde os dados do usuário estão armazenados e como os usuários são autenticados, é recomendável criar um MembershipProvider personalizado. Rolar sua própria solução e mexer no cookie de autenticação significa uma alta probabilidade de introduzir falhas de segurança em seu software.

Eu não entendo sua parte 2. Você só precisa chamar FormsAuthentication.GetRedirectUrl se você quiser retornar os usuários para a página que eles estavam tentando acessar quando eles foram devolvidos para o login. Se não fizer o que quiser aqui, redirecione para um URL armazenado na configuração, se desejar.

Para ler o cookie FormsAuthentication, normalmente você conectaria o evento AuthenticateRequest em um HttpModule ou no Global.asax e configuraria o contexto IPrinciple do usuário.

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

a outra maneira de criar um 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); 

Referência

Obter os detalhes do cookie existente

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

aqui Datasecurity é uma class estática.

Criptografar e descriptografar a function Criptografar e descriptografar