当我遇到this article
时,我正在研究防止ASP.Net Web窗体应用程序中的会话固定攻击的方法。我将AbandonSession,CreateSessionId和SetSessionId方法复制到我的登录页面,并在我验证了用户凭据并将所有设置复制到原始会话之后(例如,预登录)在我的LoginButton_Click事件处理程序中添加了对这些调用的调用页)。然后,我向包含用户名的会话中添加了新值,然后重定向到登录前页面。
我的登录前页面会检查用户是否已登录,如果未登录,则设置当前页面(登录前页面)的会话值会将他们重定向到登录页面。
似乎,即使我明确设置了要在重新生成会话的调用之后在登录页面上登录的用户,也要在他们登录并重定向到登录前页面之前,该会话已清除。
经过一些研究,似乎所有会话结束的事情都发生在当前页面处理的最后。
这意味着无论我做什么,我都无法清除现有会话,无法生成新会话(和新会话ID),也无法在同一调用中登录用户并分配新会话属性。
我被困住了,想知道是否有人可以提供帮助?
如何使用户登录,验证用户凭据,生成新的ASP.Net会话ID,为用户设置一些其他会话属性,然后将用户重定向到他们请求的原始页面以允许他们移动正常吗?
在我的default.aspx(登录前页面)页面中,我有以下代码:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
userProfile = (UserProfile)Session["UserProfile"];
if (!userProfile.LoggedIn)
{
Session["PreLoginURL"] = Request.Url.ToString();
Response.Redirect("~/Login.aspx");
}
}
在我的login.aspx页面中,我有以下代码:
protected void LoginButton_Click(object sender, EventArgs e)
{
// Proper validation to be performed in actual website!
if (UNTextBox.Text.ToLower() == "a" && PWTextBox.Text.ToLower() == "a")
{
userProfile = (UserProfile)Session["UserProfile"];
string preLoginURL = (string)Session["PreLoginURL"];
// calls to example code - I want to assign a new session ID to the user here. Either by means of a new session or just a new ID for the current session, whichever is most appropriate
AbandonSession();
var newSessionId = CreateSessionId(HttpContext.Current);
SetSessionId(HttpContext.Current, newSessionId);
userProfile.LoggedIn = true;
Session["UserProfile"] = userProfile;
Response.Redirect(preLoginURL, false);
}
else
{
UNTextBox.Text = "";
PWTextBox.Text = "";
ErrorLabel.Text = "Username and password combination not recognised";
}
}
public void AbandonSession()
{
Session.Clear();
Session.Abandon();
Session.RemoveAll();
if (Request.Cookies["ASP.NET_SessionId"] != null)
{
Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-20);
}
}
private static string CreateSessionId(HttpContext httpContext)
{
var manager = new SessionIDManager();
string newSessionId = manager.CreateSessionID(httpContext);
return newSessionId;
}
public static void SetSessionId(HttpContext httpContext, string newSessionId)
{
var manager = new SessionIDManager();
bool redirected;
bool cookieAdded;
manager.SaveSessionID(httpContext, newSessionId, out redirected, out cookieAdded);
}