Редактиране Някои изразиха неприязън към конкретното ми решение, представено в този проблем, но моля, не ми губете времето, предлагайки напълно алтернативни методи. Нямам контрол върху изискванията на това, върху което работя. Ако не сте съгласни с него и нямате отговор, просто продължете. Благодаря.
За начало това е практически проект и няма да се използва от широката публика. Трябва да защитя някои страници в уебсайта си, като използвам свойствата на сесията за потребителско име. Това се случва (потребителското име се записва в сесията), когато се въведе правилна комбинация от потребителско име и парола. Шефът ми прегледа внедряването ми и каза, че „съхраняването на стойността на потребителското име директно в 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
}