Предотвращение фиксации сессии в приложении ASP.Net Webforms - PullRequest
0 голосов
/ 07 ноября 2018

Я искал способы предотвращения атак фиксации сеанса в приложении веб-форм 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...