2015-12-08 5 views
0

Я оглянулся вокруг здесь, на stackoverflow, а также на Google, но не смог найти ответ, который касался моей проблемы, поэтому я размещаю его здесь.Аутентификация имени пользователя и пароля с использованием сеанса

У меня есть страница входа, в которой пользователю предлагается ввести имя пользователя и пароль, которые оба хранятся в базе данных MySQL. Имя пользователя хранится как обычный текст, а пароль хешируется (используя CrackStation - https://crackstation.net/hashing-security.htm#aspsourcecode), а хэш сохраняется в базе данных. Я могу успешно войти в систему пользователя один раз, используя имя пользователя и пароль, но я хотел бы использовать SESSION, чтобы пользователь мог перемещаться по веб-сайту и не должен был входить в систему каждый раз, когда переходил на другую страницу. Я легко мог использовать SESSION в своей тестовой среде, потому что пароль был сохранен как обычный текст, но теперь с хэшем пароля я не могу заставить сеанс работать в моем коде. Поэтому я хотел знать, что я могу сделать, чтобы получить пароль для проверки на СЕССИИ.

Мой код, который я использую на моей странице входа в систему заключается в следующем:

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     admin = Convert.ToInt16(Request.QueryString["Admin"]);    
     Instructor = Convert.ToInt16(Request.QueryString["Inst"]);    

     if (Session["username"] == null || (string)(Session["username"]) == "") 
     {     
      token = Request.QueryString["tokenNumber"]; 

      lblUsername.Visible = true; 
      txtUsername.Visible = true; 
      lblPassword.Visible = true; 
      txtPassword.Visible = true; 
      btnlogin.Visible = true; 
     } 

     else if (Session["username"] != null || (string)(Session["username"]) != "") 
     {     
      username = (string)Session["username"]; 
      userType = (string)Session["userType"]; 
      pass = (string)Session["password"];     

      if (userType == "Participant") 
      {      
       Response.Redirect("/srls/StudentUser"); 
      } 
      else if (userType == "Coordinator") 
      { 
       Response.Redirect("/srls/CoordinatorUser");      
      } 
      else if (userType == "Instructor") 
      { 
       Response.Redirect("/srls/InstructorUser"); 
      } 
     } 


    } 
    catch (Exception exc) //Module failed to load 
    { 
     Exceptions.ProcessModuleLoadException(this, exc); 
    } 
} 

protected void btnlogin_Click(object sender, System.EventArgs e) 
{ 
    char activation; 

    if (Request.QueryString["tokenNum"] != null) 
    { 
     using (OdbcConnection dbConnection = new OdbcConnection(srlsConnStr)) 
     { 
      dbConnection.Open(); 
      { 
       OdbcCommand dbCommand = new OdbcCommand(); 
       dbCommand.Connection = dbConnection; 
       dbCommand.CommandText = @"SELECT tokenNum FROM srlslogin WHERE user_email_pk = ?"; 
       dbCommand.Parameters.AddWithValue("@user_email_pk", txtUsername.Text); 
       dbCommand.ExecuteNonQuery(); 

       OdbcDataReader dataReader = dbCommand.ExecuteReader(); 
       while (dataReader.Read()) 
       { 
        if (token == dataReader["tokenNum"].ToString()) 
        { 
         updateActivationStatus(txtUsername.Text); 
         LoginWithPasswordHashFunction(); 
        } 
        else 
        { 
         test.Text = "You are not authorized to login! Please activate your account following the activation link sent to your email " + txtUsername.Text + " !"; 
        } 
       } 
      } 
      dbConnection.Close(); 
     } 

    } 
    else if (Request.QueryString["tokenNum"] == null) 
    { 
     using (OdbcConnection dbConnection = new OdbcConnection(srlsConnStr)) 
     { 
      dbConnection.Open(); 
      { 
       OdbcCommand dbCommand1 = new OdbcCommand(); 
       dbCommand1.Connection = dbConnection; 
       dbCommand1.CommandText = @"SELECT * FROM srlslogin WHERE user_email_pk = ?;"; 

       dbCommand1.Parameters.AddWithValue("@user_email_pk", txtUsername.Text); 
       dbCommand1.ExecuteNonQuery(); 

       OdbcDataReader dataReader1 = dbCommand1.ExecuteReader(); 
       if (dataReader1.Read()) 
       { 
        activation = Convert.ToChar(dataReader1["activation_status"]); 
        if (activation == 'Y') 
        { 
         activation status, activation == Y"; 
         LoginWithPasswordHashFunction(); 
        } 
        else 
        { 
         lblMessage.Text = "Please activate your account following the Activation link emailed to you at <i>" + txtUsername.Text + "</i> to Continue!"; 
        } 
       } 
       else 
       { 
        lblMessage.Text = "Invalid Username or Password"; 
       } 
       dataReader1.Close(); 
      } 
      dbConnection.Close(); 
     } 
    } 
} 

private void LoginWithPasswordHashFunction() 
{ 
    List<string> salthashList = null; 
    List<string> usernameList = null; 

    try 
    { 
     using (OdbcConnection dbConnection = new OdbcConnection(srlsConnStr)) 
     { 
      dbConnection.Open(); 
      { 
       OdbcCommand dbCommand = new OdbcCommand(); 
       dbCommand.Connection = dbConnection; 
       dbCommand.CommandText = @"SELECT slowhashsalt, user_email_pk FROM srlslogin WHERE user_email_pk = ?;"; 

       dbCommand.Parameters.AddWithValue(@"user_email_pk", txtUsername.Text); 
       OdbcDataReader dataReader = dbCommand.ExecuteReader(); 
       while (dataReader.HasRows && dataReader.Read()) 
       { 
        if (salthashList == null) 
        { 
         salthashList = new List<string>(); 
         usernameList = new List<string>(); 
        } 

        string saltHashes = dataReader.GetString(dataReader.GetOrdinal("slowhashsalt")); 
        salthashList.Add(saltHashes); 

        string userInfo = dataReader.GetString(dataReader.GetOrdinal("user_email_pk")); 

        usernameList.Add(userInfo); 
       } 

       dataReader.Close(); 

       if (salthashList != null) 
       { 

        for (int i = 0; i < salthashList.Count; i++) 
        { 
         bool validUser = PasswordHash.ValidatePassword(txtPassword.Text, salthashList[i]); 
         if (validUser == true) 
         {          
          Session["user_email_pk"] = usernameList[i]; 

          OdbcCommand dbCommand1 = new OdbcCommand(); 
          dbCommand1.Connection = dbConnection; 
          dbCommand1.CommandText = @"SELECT user_status FROM srlslogin WHERE user_email_pk = ?;"; 

          dbCommand1.Parameters.AddWithValue("@user_email_pk", txtUsername.Text); 
          dbCommand1.ExecuteNonQuery(); 

          OdbcDataReader dataReader1 = dbCommand1.ExecuteReader(); 
          while (dataReader1.Read()) 
          { 
           user_status = dataReader1["user_status"].ToString(); 
           Session["userType"] = user_status; 
          } 

          Response.BufferOutput = true; 

          if (user_status == "Participant") 
          { 
           Response.Redirect("/srls/StudentUser", false); 
          } 
          else if (user_status == "Coordinator") 
          { 
           Response.Redirect("/srls/CoordinatorUser", false); 
          } 
          else if (user_status == "Instructor") 
          { 
           Response.Redirect("/srls/InstructorUser", false); 
          } 

          dataReader1.Close(); 
       Response.Redirect(/srls/StudentUser) - Goes to Login Page"; 
         } 
         else 
         { 
          lblMessage.Text = "Invalid Username or Password! Please Try Again!"; 
         } 
        } 
       } 
      } 
      dbConnection.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
+0

вы знакомы с 'PostBacks' вам нужно хранить, например, в' OnSession_Start', например, объявить переменную, как это, например 'HttpContext.Current.Session [«isValidUser» ] = false; 'тогда в вашей логической или проверяющей части кода установите переменную сеанса, если действительный пользователь имеет значение true ' HttpContext.Current.Session ["isValidUser"] = true; 'поскольку кнопка вызывает PostBack, вам нужно иметь некоторый 'if (! IsPostBack)' проверяет ваш логин в событии Page_Load. – MethodMan

+0

Спасибо за предложение @MethodMan, я посмотрю на это и посмотрю, как это работает. – skaur

ответ

0

Вы должны не магазин имя пользователя и пароль в сеансе. Вы должны сохранить «факт», что пользователь был успешно зарегистрирован. Но на самом деле вы даже не должны этого делать. ASP.NET поставляется с различными методами аутентификации. Пожалуйста, посмотрите на http://www.asp.net/identity, чтобы начать.

+0

Спасибо за ответ @Mark, я взгляну на ссылку и начну с нее. – skaur

0

Это не очень хорошее решение. Не храните имя пользователя, пароль, тип и т. Д. В своих сеансах. Как только пользователь войдет в систему, просто сохраните его идентификатор. Я использую следующий путь: у меня есть страница входа, и у меня есть MasterPage, и все мои веб-формы унаследованы от MasterPage. И в MasterPage на Page_Init я сделать что-то вроде:

string users_role = MyClass.GetUsersRoleById(Session["id"].ToString()); 

У меня есть роль пользователя в базе данных, поэтому по идентификатору я могу исключить роль пользователя. И, например, у вас есть одна папка для каждой роли. Вы можете сделать что-то вроде:

if (String.IsNullOrEmpty(users_role)) //if null it means that user have no any role or you didn't checked for authorization first 
    Response.Redirect(users_role); //redirect to role's page: e.g. Admin, User, Student, Teacher, so on. 
Смежные вопросы