きっかけ
セッションハイジャックへの対応策として「ログイン成功後に、新しくセッションを開始する」⇒ 「ログイン成功時に、以前のセッションを破棄し新しいセッションIDを割り振る」という方法があるが、ではWeb Formでの認証時にはどのようなコーディングを行えばよいのかを調べたので、メモとして記事を書くことにした。
基本的な考え方
行うことは単純で
- ログイン前から存在するセッションを破棄する
- 新しいセッションIDを割り振る
の2点だけである。
ASP.NETは標準ではCookieにセッションIDを保持し、そのキーは"ASP.NET_SessionId"という事実があるので、それを考慮する。
ログイン成功後は、当初要求のあったページへのリダイレクトを行うとすると、リダイレクト処理の直前にこれらの処理を入れてあげるのがよいと思われる。
実装
Login成功後の処理をどこに記述するかは好みの問題があるが、ここでは単純にLogin.aspx(.cs)に記述するパターンを書いてみる。
protected override void Login_Click(object sender, EventArgs e)
{
try
{
string userid = UserId.Value + string.Empty;
string password = Password.Value + string.Empty;
if (Authenticate(userid,password))
{
//認証OK
HttpContext.Current.Session.Abandon();
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", CreateSessionID()));
FormsAuthentication.RedirectFromLoginPage(userid, false);
}
else
{
//認証NG
Msg.Text = ErrorMessage;
}
} catch (Exception ex) {
// 例外処理
}
}
private bool Authenticate(string userid, string password)
{
// DBへの問い合わせなどを行う
}
private string CreateSessionID()
{
// GUIDを用いてセッションIDを作成する
return Guid.NewGuid().ToString();
}
ブラウザ(例えばEdge)のF12を押して開発ツールを起動し、アプリケーションタブを開いてもらうと確認できるが、ログインの前後で"ASP.NET_SessionId"キーを持つCookieの値が変わっている。
ログアウト処理
更新されたセッションIDはログインしている情報に紐づいていることを示しているので、ログアウトの処理などアプリケーションを抜ける処理を行う際にはセッションを破棄してあげる必要がある。