Я искал способы предотвращения атак фиксации сеанса в приложении веб-форм ASP.Net, когда натолкнулся на эту статью
Я скопировал методы AbandonSession, CreateSessionId и SetSessionId на свою страницу входа в систему и добавил вызовы к ним в моем обработчике событий LoginButton_Click ПОСЛЕ того, как я проверил учетные данные пользователя и скопировал любые настройки из исходного сеанса (например, предварительный вход в систему) страница). Затем я добавил новые значения в сеанс, который, например, содержал имя пользователя, а затем перенаправил их на страницу перед входом в систему.
Моя страница перед входом в систему проверяет, вошел ли пользователь в систему, и, если нет, задает значение сеанса для текущей страницы (страница перед входом в систему), перенаправляет его на страницу входа.
Кажется, что даже если я явно настроил пользователя на вход в систему на странице входа в систему ПОСЛЕ вызовов для восстановления сеанса, к тому времени, как они вошли в систему и были перенаправлены обратно на страницу перед входом в систему, сеанс был очищен.
После небольшого исследования кажется, что весь процесс завершения сеанса происходит в самом конце обработки текущей страницы.
Это означает, что независимо от того, что я делаю, я не могу очистить существующий сеанс, сгенерировать новый сеанс (и новый идентификатор сеанса) И войти в систему пользователя и назначить новые свойства сеанса в одном вызове.
Я застрял, и мне было интересно, если кто-нибудь может помочь?
Как заставить пользователя войти в систему, проверить учетные данные пользователя, сгенерировать новый идентификатор сеанса ASP.Net, установить некоторые дополнительные свойства сеанса для пользователя, а затем перенаправить пользователя на исходную страницу, которую он запрашивал, разрешить ему перемещаться как обычно?
На моей странице 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);
}