Создайте и прочитайте cookie для подтверждения входа пользователя в C # MVC3 - PullRequest
5 голосов
/ 16 февраля 2012

У меня проблема с куки в MVC3.Я хочу создать cookie-файл, который хранит информацию о том, вошел ли пользователь в систему. Я никогда раньше не использовал cookie-файлы и не знаю, как это сделать, и я новичок в MVC3.Пожалуйста, кто-нибудь может сказать мне, если подход, который я использовал для хранения файлов cookie, является правильным, или если существует некоторая угроза безопасности (пароль зашифрован)?Если файлы cookie установлены правильно, как я могу использовать их в других представлениях, чтобы проверить, вошел ли пользователь в систему, и установить для него сеанс?Если подход, который я использую для входа в систему, неверен, просто скажите мне.

public ActionResult Login(string name, string hash, string keepLogged)
    {
        if (string.IsNullOrWhiteSpace(hash))
        {
            Random random = new Random();
            byte[] randomData = new byte[sizeof(long)];
            random.NextBytes(randomData);
            string newNonce = BitConverter.ToUInt64(randomData, 0).ToString("X16");
            Session["Nonce"] = newNonce;
            return View(model: newNonce);
        }

        User user = model.Users.Where(x => x.Name == name).FirstOrDefault();
        string nonce = Session["Nonce"] as string;
        if (user == null || string.IsNullOrWhiteSpace(nonce))
        {
            return RedirectToAction("Login", "Users");
        }

        string computedHash;
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] hashInput = Encoding.ASCII.GetBytes(user.Password + nonce);
            byte[] hashData = sha256.ComputeHash(hashInput);
            StringBuilder stringBuilder = new StringBuilder();
            foreach (byte value in hashData)
            {
                stringBuilder.AppendFormat("{0:X2}", value);
            }
            computedHash = stringBuilder.ToString();
        }

        if (computedHash.ToLower() == hash.ToLower())
        {                
            Session["IsAdmin"] = user.IsAdmin == 1;
            Session["IDUser"] = user.IDUser;

            ViewBag.IdUser = IDUser;
            ViewBag.IsAdmin = IsAdmin;
            ViewBag.UserName = model.Users.Where(x => x.IDUser == IDUser).First().Name;

            if (keepLogged == "keepLogged")
            {
                //Set user's cookies - is this correct?
                Response.Cookies.Add(new HttpCookie("UserCookie", user.IDUser.ToString()));
                Response.Cookies.Add(new HttpCookie("PassCookie", user.Password.ToString()));
            }
        }
        return RedirectToAction("Index", "Posts");
    }

Ответы [ 3 ]

17 голосов
/ 16 февраля 2012

Этот код создает зашифрованный cookie с именем пользователя

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1,
    user.UserName,
    DateTime.Now,
    DateTime.Now.AddMinutes(10),
    false,
    null);

string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

this.Response.Cookies.Add(cookie);

Чтобы включить проверку подлинности с помощью форм, добавьте в раздел system.web файла web.config следующее:

<authentication mode="Forms">
  <forms loginUrl="~/Logon" timeout="2880" />
</authentication>
4 голосов
/ 16 февраля 2012

Вот моя упрощенная версия, как вы можете работать с куки-файлами для запоминания имени пользователя

   /// <summary>
   /// Account controller.
   /// </summary>

      public ActionResult LogOn()
      {
         LogOnModel logOnModel = new LogOnModel();

         HttpCookie existingCookie = Request.Cookies["userName"];
         if (existingCookie != null)
         {
            logOnModel.UserName = existingCookie.Value;
         }

         return View(logOnModel);
      }


      public ActionResult LogOn(LogOnModel model, string returnUrl)
      {
         if (model.RememberMe)
         {
            // check if cookie exists and if yes update
            HttpCookie existingCookie = Request.Cookies["userName"];
            if (existingCookie != null)
            {
               // force to expire it
               existingCookie.Value = model.UserName;
               existingCookie.Expires = DateTime.Now.AddHours(-20);
            }

            // create a cookie
            HttpCookie newCookie = new HttpCookie("userName", model.UserName);
            newCookie.Expires = DateTime.Today.AddMonths(12);
            Response.Cookies.Add(newCookie);
         }


         // If we got this far, something failed, redisplay form
         return View(model);
      }
4 голосов
/ 16 февраля 2012

Нет, вы не хотите хранить пароль пользователя в специальном куки.Посмотрите на Формы Аутентификации.Это все печенья работают на вас.Вы можете установить, чтобы эти cookie-файлы форм сохранялись на компьютере пользователя, чтобы они «оставались в системе».

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