asp.net вы можете смешивать cookieless с данными сеанса, сохраненными в cookie? - PullRequest
3 голосов
/ 19 марта 2011

Можно ли использовать смешанные сеансы без файлов cookie с сеансами файлов cookie?

У меня есть приложение, которое собирало данные пользователя, а затем перенаправляло их для оплаты на страницу ssl. Мне было интересно, если это возможно?

http://www.mydomain.com/confirm.aspx

перенаправляет на

https://www.mydomain.com/(S(za1tw2l2k02jer4fiskzlovd))/payment.aspx

Примечание: идентификатор сессии в последнем URL.

Таким образом, по сути, мы используем стандартный сеанс cookie для большинства приложений, но когда мы переносим на страницу ssl, мы передаем SessionId в URL-адрес https, чтобы забрать сеанс. Я попробовал это локально, но начинается новый сеанс.

Мне не хватает трюка?

Спасибо

1 Ответ

2 голосов
/ 20 марта 2011

Я нашел решение, которое, кажется, работает

При передаче между http и https у меня есть следующее:

Как вы видите, я пропускаю сессиюid вручную на страницу https.

protected void btnPurchase_Click(object sender, EventArgs e)
{
        // Confirm puchase code **

        string sslPaymentPath = string.Format("https://{0}/payment.aspx?sid={1}", Request.Url.DnsSafeHost, Session.SessionID);

        Response.Redirect(sslPaymentPath);

}

При достижении страницы ssl asp.net видит запрос как новый сеанс, поэтому я использую метод Start_Session в global.asax, чтобы отказаться от новогосоздал сеанс и добавьте новый файл cookie сеанса с идентификатором сеанса, переданным из строки запроса.Поскольку AquireSessionState, который заполняет сессионную пару keyValue, к этому моменту уже был запущен, мне нужно перенаправить страницу обратно на себя, чтобы снова заполнить эти значения.

Кажется, это работает очень хорошо:)

    void Session_Start(object sender, EventArgs e)
    {
        bool isPaymentPage = (Request.Path.ToLower().IndexOf("payment.aspx") != -1);

        // Code to load session over ssl. When changing between two sessions
        if (isPaymentPage && Request.QueryString["sid"] != null && Request.IsSecureConnection)
        {
            string passedSessionId = Request.QueryString["sid"];
            Session.Abandon();
            Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", passedSessionId));
            Response.Redirect(Request.Url.LocalPath, true);
        }
    }

Также в отношении того, что кто-то нажимал на внешнюю ссылку, просматривая страницу ssl purchase.aspx, которую я написал в global.asax, чтобы перенаправить трафик обратно на стандартные ни одной страницы ssl, если это не страница оплаты.

void Application_BeginRequest(object sender, EventArgs e)
    {
        bool isPaymentPage = (Request.Path.ToLower().IndexOf("payment.aspx") != -1);

        // In the case someone has navigated away from the payment page redirect them back to the none secure protocol.
        if (!isPaymentPage && Request.IsSecureConnection)
        {
            bool isAxdResource = (Request.Path.ToLower().IndexOf(".axd") != -1);

            if (!isAxdResource)
            {
                string url = Request.Url.AbsoluteUri.ToLower().Replace("https://", "http://");
                Response.Redirect(url,true);
            }
        }
    }

Надеюсь, кто-нибудь найдет это полезным, я застрял на некоторое время, пытаясь найти хорошее решение.

Мое вдохновение пришло от этого URL .

...