編集この問題で提示された私の特定の解決策に嫌悪感を表明する人もいますが、完全に代替の方法を提案するために私の時間を無駄にしないでください. 自分が取り組んでいることの要件を制御することはできません。それに同意せず、答えがない場合は、そのまま進んでください。ありがとう。
まず、これは練習用のプロジェクトであり、一般の人は使用しません。ユーザー名のセッション プロパティを使用して、Web サイトのいくつかのページを保護する必要があります。これは、正しいユーザー名とパスワードの組み合わせが入力されたときに発生します (ユーザー名がセッションに保存されます)。私の上司は私の実装をレビューし、「ユーザー名の値を HttpSessionState に直接保存するのは間違っています。セッションのユーザー名プロパティを設定し、セッション オブジェクトを HttpSessionState に保存する必要があります」と言いました。これで、彼が参照しているコードの部分は理解できたと思いますが、これを変更するとセキュリティが破られます (1 人のユーザーがログインすると、誰でもページへの直接リンクを使用できます)。
コード内のコメントを必ず読んでください。問題の行を説明するためにコメントを追加しました。
セキュリティの観点からは機能しましたが、ユーザー名は 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
}