Как вручную создать cookie проверки подлинности вместо метода по умолчанию?

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

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

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

Ответ 1

Здесь вы идете. 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;
    }
}

Ответ 2

Отвечать Обновление на количество поданных голосов за этот пост, Правило создания файла 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 - это статический класс.

Шифрование и расшифровка