2012-06-28 4 views
9

У нас есть веб-сайт в классическом asp, который мы медленно переносим на ASP.NET по мере необходимости.ASP-переменные сеанса ASP.NET

Проблема, конечно, в том, как классические asp и ASP.NET обрабатывают сеансы. Проведя последние несколько часов, исследуя Интернет, я нашел много статей, но не тот, который выделялся среди других.

Есть ли наилучшая практика для переноса переменных сеанса из и в классические asp и asp.net? Безопасность является обязательным, и любое объяснение с примерами очень ценится.

+0

Я должен быть готов к концу этой недели с решением, которое наилучшим образом соответствует нашим потребностям. Я также упомянул некоторые другие методы. Оставайтесь на связи. – PsychoDUCK

ответ

5

Простой мост передать одну переменную сеанса от классического жереха к .net ServerSide (скрывая ваш sessionvalue от клиента), будет таким:

  • На конце ASP: Сотрудница осина страницы для вывода ваш сеанс, назовите его, например, asp2netbridge.asp

    <% 
    'Make sure it can be only called from local server ' 
    if (request.servervariables("LOCAL_ADDR") = request.servervariables("REMOTE_ADDR")) then 
        if (Request.QueryString("sessVar") <> "") then 
         response.write Session(Request.QueryString("sessVar")) 
        end if 
    end if 
    %> 
    
  • В конце .net, удаленный вызов к этой осины странице.:

    private static string GetAspSession(string sessionValue) 
    { 
        HttpWebRequest _myRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://yourdomain.com/asp2netbridge.asp?sessVar=" + sessionValue)); 
        _myRequest.ContentType = "text/html"; 
        _myRequest.Credentials = CredentialCache.DefaultCredentials; 
        if (_myRequest.CookieContainer == null) 
         _myRequest.CookieContainer = new CookieContainer(); 
        foreach (string cookieKey in HttpContext.Current.Request.Cookies.Keys) 
        { 
         ' it is absolutely necessary to pass the ASPSESSIONID cookie or you will start a new session ! ' 
         if (cookieKey.StartsWith("ASPSESSIONID")) { 
          HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieKey.ToString()]; 
          _myRequest.CookieContainer.Add(new Cookie(cookie.Name, cookie.Value, cookie.Path, string.IsNullOrEmpty(cookie.Domain) 
           ? HttpContext.Current.Request.Url.Host 
           : cookie.Domain)); 
         } 
        } 
        try 
        { 
         HttpWebResponse _myWebResponse = (HttpWebResponse)_myRequest.GetResponse(); 
    
         StreamReader sr = new StreamReader(_myWebResponse.GetResponseStream()); 
         return sr.ReadToEnd(); 
        } 
        catch (WebException we) 
        { 
         return we.Message; 
        } 
    } 
    
+0

Вот как я закончил его кодирование. Я забыл написать свой ответ. – PsychoDUCK

+0

что такое значение sessionValue? – Sajeetharan

+0

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

0

Они используют разные сеансы, поэтому вам нужно будет придумать способ передачи самих варсов. Вы можете включить их в файлы cookie или отправить их через HTTP POST (т. Е. Форму со скрытыми полями) на сторону asp.net.

В качестве альтернативы вы можете отказаться от использования хранилища сеансов и вставить все в базу данных для каждого пользователя/сеанса, а затем просто передать ключ сеанса от классического ASP к ASP.NET с помощью одного из вышеуказанных предложений. Я знаю, это звучит так, будто вы изобретаете колесо, но это может быть один из тех случаев, когда вы просто не можете обойти его.

+0

Мне хотелось бы, чтобы этот пост рассматривал все решения и определял или создавал «лучшее» решение, сохраняя при этом безопасность. Почему лучше друг друга. Очевидно, что, основываясь на определенных сценариях, лучше будет другой, но нет четкого ответа, который я мог бы найти в Интернете. – PsychoDUCK

+0

На этот вопрос нет однозначного ответа, и нельзя будет называть один ответ «лучшим», поскольку это очень субъективный термин. Вам нужно будет провести некоторое исследование и определить, что лучше всего подходит для ваших нужд. Это всего лишь некоторые идеи, и вы должны исследовать их на основе ваших потребностей. –

+0

Несмотря на соображения безопасности, я бы не отправлял vars клиенту (через файлы cookie, скрытые поля формы и т. Д.). Рассмотрим решение, подобное моему второму абзацу, где вы храните варны внутри себя и отправляете идентификатор клиенту. –

3

Я использовал мост ajax (не хочу лучшего термина), в частности, классическую страницу asp, которая читает все сессии vars в базе данных с помощью guid, затем перенаправляет на .net-страницу, передавая guid в querystring, страница asp.net читает из sql для данного guid и создала эти vars как сеансы.

Например, в классическом осины (псевдокод код - просто чтобы дать вам представление о том, использовать параметризованные запросы в вашем и т.д.):

'#### Create GUID 
Dim GUID 'as string 
GUID = CreateWindowsGUID() '#### Lots of methods on http://support.microsoft.com/kb/320375 

'#### Save session to sql 
For Each SessionVar In Session.Contents 
    db.execute("INSERT INTO SessionBridge (GUID, Key, Value) VALUES ('" & GUID & "', '" & SessionVar & "', '" & session(SessionVar) & "')") 
Next 

Затем на странице .net:

'#### Fetch GUID 
Dim GUID as string = Request.QueryString("GUID") 
session.clear 

'#### Fetch from SQL 
db.execute(RS, "SELECT * FROM SessionBridge WHERE GUID = '" & GUID & "'") 
For Each db_row as datarow in RS.rows 
    Session(db_row("Key")) = db_row("Value") 
Next 

Как я уже сказал, это очень грубый псевдокод, но вы можете вызвать asp с помощью простой функции фона ajax, а затем вызвать страницу .net для данного GUID.

Это имеет то преимущество, что вы не подвергаете клиенту все ваши ценности и ценности (как это делают почтовые методы и т. Д.).

+0

Это очень похоже на то, что я считаю хорошим решением. Но запутался на основе статьи Microsoft, которая сделала аналогичный подход, требующий регистрации библиотек безопасности и т. Д. Я не понимаю, почему это было необходимо. Вот ссылка http://msdn.microsoft.com/en-us/library/aa479313.aspx. Любая идея, почему все дополнительные работы, упомянутые в статье MSDN, есть? Если это вообще необходимо? – PsychoDUCK

+1

@PsychoDUCK Я думаю, что версия Microsoft более общая. Вы можете хранить любой объект в переменной сеанса (а не только в строках), поэтому, возможно, их решение справляется с этим. Но если вы только сохраняете строки в переменных сеанса, то это работает нормально (просто убедитесь, что значения сеанса не имеют кавычек или инструкция, размещенная здесь, вероятно, будет ломаться) – Rodolfo

0

У меня есть сайт, который делает это точное действие. Секрет заключается в том, чтобы использовать промежуточную страницу с функцией осины Response.Redirect

<% 
client_id = session("client_id") 
response.redirect "aspx_page.aspx?client_id=" & client_id 
%> 

Это пример тянуть классическую осины сеанса переменной client_id и передать его на страницу ASPX. Ваша страница aspx должна будет обработать ее оттуда.

Это должно быть в верхней части классической страницы asp, без HTML любого типа, указанного выше. IIS будет обрабатывать это на сервере и перенаправлять на страницу aspx с прилагаемой строкой запроса, не отправляя данные на клиентскую машину. Это очень быстро.

+2

«... без отправки данных на клиентскую машину» - Response.Redirect отправляет URL-адрес, содержащий client_id, на клиентскую машину. – Joe

+0

@joe может 'Server.Transfer' здесь работать или я пропущу что-то очевидное? –

0

В случае, если кто-то спотыкается сюда в поисках какой-то помощи, другой возможный вариант заключается в использовании куки. Преимущество куки-файла заключается в том, что вы можете хранить разумные объемы данных и затем сохранять эти данные в своем .Net-приложении (или другом веб-приложении). Существуют угрозы безопасности при публикации cookie, поскольку эти данные можно легко манипулировать или подделывать. Я бы не отправлял конфиденциальные данные в файл cookie. Здесь cookie хранит только уникальный идентификатор, который может использоваться для извлечения данных из таблицы.

подход:

  1. захватить данные сеанса вам нужно от классической страницы осины. Храните эти данные в таблице вместе с уникальным хешем и временной меткой.
  2. Сохраните значение хэша в недолговечном файле cookie.
  3. Перенаправление на любую страницу, в которой вы должны пойти, и прочитать хэш в файле cookie.
  4. Убедитесь, что хэш в файле cookie не истек в базе данных. Если это действительно так, отправьте обратно данные, необходимые для вашей страницы, а затем истечь хэш, чтобы он не мог быть повторно использован.

Я использовал хэш SHA 256, который был комбинацией уникального идентификатора пользователя, идентификатора сеанса и текущей метки времени. Хэш действителен всего несколько минут и истек при чтении. Идея состоит в том, чтобы ограничить окно для злоумышленника, которому нужно было бы угадать действительный хеш до истечения срока его действия.

Смежные вопросы