Как я могу вручную создать файл cookie для аутентификации вместо метода по умолчанию? - PullRequest
49 голосов
/ 28 августа 2011

Используя FormsAuthentication, мы пишем код следующим образом:

 if (IsValidUser())
 {
      FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
      FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie); 
 }
  1. Как я могу вручную создать файл cookie для аутентификации вместо записи FormsAuthentication.SetAuthCookie(userName, createPersistentCookie)?

  2. Как сохранить URL-адрес перенаправления со страницы входа в строковую переменную вместо записи FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie)?

Ответы [ 2 ]

83 голосов
/ 28 августа 2011

Вот, пожалуйста.ASP.NET заботится об этом за вас, когда вы используете методы более высокого уровня, встроенные в FormsAuthentication, но на низком уровне это требуется для создания файла cookie аутентификации.

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

Я не уверен, почему вы хотите сделать что-то особенное здесь.Если вы хотите изменить реализацию того, где хранятся пользовательские данные и как аутентифицируются пользователи, лучше создать пользовательский MembershipProvider.Использование собственного решения и использование файла cookie для проверки подлинности означает высокую вероятность появления дыр в безопасности вашего программного обеспечения.

Я не понимаю вашу часть 2. Вам нужно только вызвать FormsAuthentication.GetRedirectUrl, если вы хотите вернутьсяпользователи на страницу, к которой они пытались получить доступ, когда им было отказано в входе.Если вы не делаете то, что хотите, перенаправьте на URL-адрес, сохраненный в конфигурации, если хотите.

Чтобы прочитать файл cookie FormsAuthentication, обычно вы подключаете событие AuthenticateRequest в HttpModule или Global.asax инастроить пользовательский 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 голосов
/ 09 марта 2016

Ответ Обновление количества голосов, поданных за это сообщение, Правильное создание файла cookie с информацией о пользователе следующим образом,

Проверка файлов cookie при загрузке страницы страницы входа в систему,

if (HttpContext.Current.User.Identity.IsAuthenticated)

Создание файла cookie во время аутентификации пользователя. Логин,

 FormsAuthentication.SetAuthCookie(txtUserName.Text.Trim(), true);
 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1,
    txtUserName.Text.Trim(), 
    DateTime.Now,
   (chkRemember.Checked) ? DateTime.Now.AddHours(6) : DateTime.Now.AddHours(2),// Specify timelimit as required
   true,
   string.Empty,                                                
   FormsAuthentication.FormsCookiePath);  
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Expires = (chkRemember.Checked) ? DateTime.Now.AddHours(6) : DateTime.Now.AddHours(2);
cookie.HttpOnly = true;
Response.Cookies.Add(cookie);

Ниже приведен ответ с отрицательным голосом - причина добавления зашифрованного пароля в файл cookie.

другой способ создания файла 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);

Ссылка

Получить сведения о существующих файлах cookie

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

здесь Datasecurity является статическим классом.

Функция шифрования и дешифрования Шифрование и дешифрование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...