Запазване на потребителското име в свойството на сесията за подпомагане на защитата на сайта

Редактиране Някои изразиха неприязън към конкретното ми решение, представено в този проблем, но моля, не ми губете времето, предлагайки напълно алтернативни методи. Нямам контрол върху изискванията на това, върху което работя. Ако не сте съгласни с него и нямате отговор, просто продължете. Благодаря.

За начало това е практически проект и няма да се използва от широката публика. Трябва да защитя някои страници в уебсайта си, като използвам свойствата на сесията за потребителско име. Това се случва (потребителското име се записва в сесията), когато се въведе правилна комбинация от потребителско име и парола. Шефът ми прегледа внедряването ми и каза, че „съхраняването на стойността на потребителското име директно в HttpSessionState е грешно, трябва да зададете свойството потребителско име на сесията и да съхраните обекта на сесията в HttpSessionState“. Сега мисля, че разбирам кои части от моя код има предвид, но промяната на това нарушава сигурността (всеки може да използва директна връзка към страница, след като един потребител е влязъл).

Не забравяйте да прочетете коментарите в код, добавих ги, за да опиша въпросните редове.

Какво работи по отношение на сигурността, но потребителското име се съхранява директно в HttpSessionState:

//login.ascx.cs
private void Login_Click(object sender, EventArgs e)
{
   if (sender == null || e == null)
   {
      throw new ArgumentNullException("Null Exception: Login_Click");
   }

   User user = new User();            
   user.Login(_username.Text, _password.Text);           

   if (user.IsValid() && user.GetIsUser() != false)
   {
      user.Save();
      //the line below is what I used to make the secure pages work properly.
      //but based on what my boss says, I think this is what should be changed.
      Session["Username"] = _username.Text;
      //What i tried instead was to set 'MySession.Current.Username = _username.Text;'
      //which allowed successful login, but the pages became insecure once again.
      Response.Redirect("Secure/Default.aspx");
   }
   else
   {
      DisplayErrors(user._validationErrors);
   }
   _errors.Text = errorMessage;    
}       

и MySession.cs

public string Username
{
   get
   {
      if (HttpContext.Current.Session["Username"] == null)
      {
         return string.Empty;
      }
      else
      {
         return HttpContext.Current.Session["Username"].ToString();
      }
   }
   set
   {
      //when the line below is uncommented, the secure pages are vulnerable
      //but if I comment it out, they work properly.
      //HttpContext.Current.Session["Username"] = value;
   }
}

И така, как мога да Set the username property of the session, and store the session object into the HttpSessionState като същевременно поддържам защитен сайт?

РЕДАКТИРАНЕ: @Win, в рамките на Secure/Default.aspx.cs

private void Page_load(object sender, System.EventArgs e)
{
   ...
   if((string)Session["Username"] != _labelusername.Text)
   {
      Response.Redirect(redirectLogin); //to login page
   } 
   else {} //success
}

person Nibirue    schedule 23.01.2013    source източник
comment
Използвайте членство, а не сесия, за удостоверяване.   -  person Craig Stuntz    schedule 24.01.2013
comment
Мислех, че първият ми ред изясни, че това е проект за обучение и правенето на това не е част от проекта и би било отрицателно. Много е вероятно да го направя по твоя начин в бъдеще.   -  person Nibirue    schedule 24.01.2013
comment
Разбирам това, но членството е наистина лесно за използване и не мога да разбера защо бихте тренирали, като правите нещо неправилно. Сесията не може да се използва за съхраняване на чувствителна информация никога. Това е специфичен за потребителя кеш, нищо повече. Никога не го използвайте за какъвто и да е вид удостоверяване или сигурност!   -  person Craig Stuntz    schedule 24.01.2013
comment
MySession.Current.Username = _username.Text; е валиден, докато е статичен клас. Как защитавате в Secure/Default.aspx? Моля, публикувайте кода за проверка на сигурността на тази страница.   -  person Win    schedule 24.01.2013
comment
Добре Уин, редактирах OP с тази информация, която поискахте.   -  person Nibirue    schedule 24.01.2013


Отговори (1)


Трябва да разгледате FormsAuthentication. Има много примери онлайн като този:

http://bradkingsley.com/securing-asp-net-pages-forms-authentication-c-and-net-4/

person Andy Refuerzo    schedule 23.01.2013