Вход с использованием файлов cookie не работает в ASP.net

#c# #asp.net #cookies

#c# #asp.net #файлы cookie

Вопрос:

Я пытаюсь создать систему входа в систему на основе файлов cookie (чтобы не выделять при закрытии или обновлении страницы)

это код, лежащий в основе Login.aspx.cs:

   string cmdText = "SELECT Username,Role FROM Login WHERE Username = '"   TextBox1.Text   "' AND Password = '"   TextBox2.Text   "'";

        string username = "";
        string role = "";
        using (SqlCommand SelectCommand = new SqlCommand(cmdText, connectionstring))
        {
            SqlDataReader myReader;
            connectionstring.Open();
            myReader = SelectCommand.ExecuteReader();


            while (myReader.Read())
            {
                username = myReader["username"].ToString();
                role = myReader["role"].ToString();
            }

            myReader.Close();

            if (!string.IsNullOrEmpty(username))
            {
                string script = "alert("Login successful!");";
                ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script, true);
                connectionstring.Close();

                //STORE userinfo into cookie,set cookie Expires 1 day more
                Response.Cookies["username"].Path = username;
                Response.Cookies["username"].Expires = DateTime.Now.AddDays(1);
                Response.Cookies["username"].Path = "/";

                Response.Cookies["role"].Path = role;
                Response.Cookies["role"].Expires = DateTime.Now.AddDays(1);
                Response.Cookies["role"].Path = "/";



                if (role.Equals("admin"))
                {
                    Response.Redirect("admin.aspx");

                    Label1.Text = "admin";

                }

                if (role.Equals("doctor"))
                {
                    Response.Redirect("doctor.aspx");
                    Label1.Text = "doc";
                }


                if (role.equals("patient"))
                {
                    Response.Redirect("patient.aspx");
                }

            }
            else
            {
                string script = "alert("Login Failed!");";
                ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script, true);
                connectionstring.Close();
            }
        }
    }
  

но, похоже, у меня возникли проблемы с перенаправлением на нужную мне страницу.
когда я ввожу имя пользователя и пароль для роли администратора. Он сообщает, что вход в систему выполнен успешно, но не переходит на страницу администратора.
Почему это так? Я что-то упустил?

Для администратора (и других страниц) Я использую этот код для чтения файлов cookie

             string role = "";
            string username = "";
            if (Request.Cookies["role"] != null)
            {
                  role = Request.Cookies["role"].Value;

            }

            if (Request.Cookies["role"] != null)
            { 
              username = Request.Cookies["username"].Value;
            }

            if (role == "patient ")
            { 
                //SET control visible=false if no right.
                Button1.Visible = false;
            }
  

и это для редактирования файлов cookie после входа в систему и / или после того, как пользователь поет

     //create cookie
Response.Cookies["username"].Value =  Server.UrlEncode("abc");
Response.Cookies["username"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["username"].Path = "/";

//modify cookie value
Response.Cookies["username"].Value =  Server.UrlEncode("def");;
Response.Cookies["username"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["username"].Path = "/";


//delete cookie value
//delete cookie infact is set Expires is past day   DateTime.Now.AddDays(-1);
Response.Cookies["username"].Value = Server.UrlEncode("def");
Response.Cookies["username"].Expires = DateTime.Now.AddDays(-1);
Response.Cookies["username"].Path = "/";

//checking if cookie exist and reading it.
 if (Request.Cookies["role"] != null)
                {
                      role = Server.UrlDecode(Request.Cookies["role"].Value);

   }
  

но, похоже, я что-то упускаю, чего я не понимаю. Я думаю, что проблема заключается в функции if, здесь:

  if (role.Equals("admin"))
  

есть предложения? правильно ли это использовать файлы cookie?

Комментарии:

1. Зачем заново изобретать колесо? asp.net вся эта функциональность уже встроена. И поскольку ваш код сейчас очень уязвим для SQL-инъекций, и ваши файлы cookie, вероятно, небезопасны. Погуглите asp net authentication или прочитайте эту статью: c-sharpcorner.com/uploadfile/syedshakeer /…

2. Вы получаете какие-либо сообщения об ошибках для response.redirect?

3. @Balaji я не могу повторно подключиться к нужной странице. в соответствии с ролью (доктор) Я не перенаправляюсь ни на одну страницу. он просто остается там, на странице входа.

4. @VDWWD Большое спасибо. Я постараюсь взглянуть на это. но не могли бы вы, пожалуйста, попытаться ответить на это, а не просто прокомментировать, чтобы я мог указать это в качестве ответа?

5. вы можете его отладить? либо с использованием VS, либо с помощью отладки javascript?

Ответ №1:

Я тоже новичок в файлах cookie, но после нескольких часов поиска в Google я использую файлы cookie таким образом, и это работает, надеюсь, это поможет вам
добавить файлы cookie:

 string UserData = _User   "/"   _Password;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1 , _User , DateTime.Now, DateTime.Now.AddMinutes(60), _KeepLoggedIn, UserData);
string encrypted = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Name = "SESSION";

Response.Cookies.Add(cookie);
  

Для чтения файлов cookie:

 HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("SESSION");
            if (cookie != null)
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
                var userName = ticket.Name;
                var userData = ticket.UserData.Split('/').ToArray();

                string _User = userData[0];
                string _Password = userData[1];
                ... Your code to authenticate and 'Response.Redirect'...
             }
  

Чтобы «удалить» файлы cookie:

 int limit = Request.Cookies.Count; //Get the number of cookies and 
                                               //use that as the limit.
            HttpCookie aCookie;   //Instantiate a cookie placeholder
            string cookieName;

        //Loop through the cookies
        for (int i = 0; i < limit; i  )
        {
            cookieName = Request.Cookies[i].Name;    //get the name of the current cookie
            aCookie = new HttpCookie(cookieName);    //create a new cookie with the same
                                                     // name as the one you're deleting
            aCookie.Value = "";    //set a blank value to the cookie 
            aCookie.Expires = DateTime.Now.AddDays(-1);    //Setting the expiration date
                                                           //in the past deletes the cookie

            Response.Cookies.Add(aCookie);    //Set the cookie to delete it.
        }
  

Ответ №2:

Зачем заново изобретать колесо? asp.net вся эта функциональность уже встроена. И поскольку ваш код сейчас очень уязвим для SQL-инъекций, и ваши файлы cookie, вероятно, небезопасны. Google asp net authentication

Этот простой учебник покажет вам, как начать работу: http://www.c-sharpcorner.com/uploadfile/syedshakeer/formsauthentication-in-Asp-Net /

Вам также необходимо будет создать базу данных для хранения пользователя, паролей, ролей и т. Д. Эта статья может помочь вам в этом: https://www.asp.net/web-forms/overview/older-versions-security/membership/creating-the-membership-schema-in-sql-server-vb

Также, если вы создадите новый проект в Visual Studio, он добавит форму входа (и многое другое), чтобы вы могли использовать ее в качестве примера. Файл> Новый проект> Веб > ASP.NET Веб-приложение