ASP到ASP.NET会话变量(ASP to ASP.NET Session Variables)

2019-06-25 21:15发布

我们在传统的ASP网站,我们正在慢慢地迁移到ASP.NET是必要的。

当然,问题是经典的ASP和ASP.NET如何处理会话。 度过最后几个小时的研究后,网页,我发现,站出来比其他很多文章,却没有一个。

是否有往返于传统的ASP和asp.net传输会话变量的最佳做法? 安全性是必须的,举例任何解释是非常赞赏。

Answer 1:

一个简单的桥通过从传统的ASP到.NET服务器端的单一会话变量(从客户端隐藏你的sessionvalue),会是这样:

  • 在ASP结尾: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端,远程调用该ASP页。 :

     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; } } 


Answer 2:

我用一个AJAX桥(为一个更好的词想),具体而言,读取所有会话的传统的ASP页面瓦尔与一个GUID一个数据库,它会将路过的GUID的查询字符串一个.net页面中, asp.net页面从SQL对于给定的GUID读取和创建的那些增值经销商的会话。

例如,在传统的ASP(伪码的代码 - 只是为了给你一个想法,用在你等参数化查询):

'#### 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。

这有所有VAR和值不会暴露给客户端(如邮寄方法做等)的优势。



Answer 3:

他们使用不同的会话,所以你需要制定转移自己瓦尔的一些方法。 你可以将它们包含在Cookie或通过HTTP POST(即隐藏字段形式)送他们到asp.net一边。

或者,你可以放弃使用会话存储和为每个用户/会话的数据库坚持一切,然后刚刚从传统的ASP通过上述建议之一传递会话密钥到ASP.NET。 我知道这听起来像你重新发明轮子,但是这可能是这些情况下,你就不能围绕它得到一个。



Answer 4:

我有一个网站,不,准确的动作。 秘诀就是使用一个中间页面与ASP功能的Response.Redirect

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

这是拉动传统的ASP会话变量的client_id并把它传递到aspx页面的例子。 你的aspx页面将需要从那里处理它。

这需要是在传统的ASP页面的顶部,没有HTML上述任何类型。 IIS将处理此服务器上,并重定向到与所连接的查询字符串aspx页面,而无需将数据发送给客户机。 它的速度非常快。



Answer 5:

万一别人绊倒在这里寻找一些帮助,另一种可能的选择是使用Cookie。 Cookie的好处是,你可以存储合理数量的数据,然后将数据持久化到您的.NET应用程序(或其他Web应用程序)。 有与露出一个cookie,因为这些数据可以很容易地操纵或伪造的安全隐患。 我不会在cookie中发送的敏感数据。 这里所述的cookie仅存储的唯一标识符可以被用来从表中检索数据。

该方法:

  1. 抓住你从传统的ASP页面需要的会话数据。 有一个唯一的哈希和时间戳一起存储在表中这些数据。
  2. 存储在一个短暂的cookie中的哈希值。
  3. 重定向到任何你需要的页面去读取cookie中的哈希值。
  4. 检查cookie中的哈希数据库中还没有到期。 如果它是有效的,你需要的数据发送回您的网页,然后到期哈希所以它不能被重用。

我用SHA 256哈希值,这是用户的唯一标识符,会话ID和当前时间戳的组合。 散列是有效的只有几分钟,并在阅读已过期。 这样做是为了限制攻击者谁也需要猜测一个有效的哈希它过期前的窗口。



文章来源: ASP to ASP.NET Session Variables