我们有一个经典 ASP 网站,我们正在根据需要慢慢迁移到 ASP.NET。
问题当然是经典的 asp 和 ASP.NET 如何处理 Session。在花了最后几个小时研究网络之后,我发现了很多文章,但没有一篇比其他文章更突出。
是否有将会话变量从经典 asp 和 asp.net 传输到经典 asp 和 asp.net 的最佳实践?安全性是必须的,非常感谢任何带有示例的解释。
我们有一个经典 ASP 网站,我们正在根据需要慢慢迁移到 ASP.NET。
问题当然是经典的 asp 和 ASP.NET 如何处理 Session。在花了最后几个小时研究网络之后,我发现了很多文章,但没有一篇比其他文章更突出。
是否有将会话变量从经典 asp 和 asp.net 传输到经典 asp 和 asp.net 的最佳实践?安全性是必须的,非常感谢任何带有示例的解释。
将单个会话变量从经典 asp 传递到 .net 服务器端(向客户端隐藏会话值)的简单桥接器是这样的:
在 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;
}
}
我使用了一个 ajax 桥接器(需要一个更好的术语),特别是一个经典的 asp 页面,它将所有会话变量读入带有 guid 的数据库,然后重定向到一个 .net 页面,在查询字符串中传递 guid, 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
正如我所说,这是非常粗糙的伪代码,但您可以使用简单的背景 ajax 函数调用 asp,然后调用给定 GUID 的 .net 页面。
这具有不将所有变量和值暴露给客户端的优点(如 post 方法等)。
他们使用不同的会话,因此您需要自己设计一些传输变量的方法。您可以将它们包含在 cookie 中,或者通过 HTTP POST(即带有隐藏字段的表单)将它们发送到 asp.net 端。
或者,您可以废弃使用会话存储并将每个用户/会话的所有内容都粘贴到数据库中,然后通过上述建议之一将会话密钥从经典 ASP 传递到 ASP.NET。我知道这听起来像是你在重新发明轮子,但这可能是你无法绕过的情况之一。
我有一个网站可以执行该操作。秘诀是使用带有 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 页面,而不将数据发送到客户端计算机。它非常快。
万一其他人偶然发现这里寻求帮助,另一种可能的选择是使用 cookie。cookie 的好处是您可以存储合理数量的数据,然后将该数据保存到您的 .Net 应用程序(或其他 Web 应用程序)。暴露 cookie 存在安全风险,因为该数据很容易被操纵或伪造。我不会在 cookie 中发送敏感数据。这里 cookie 仅存储一个唯一标识符,可用于从表中检索数据。
该方法:
我使用了一个 SHA 256 哈希,它是用户的唯一标识符、会话 ID 和当前时间戳的组合。哈希仅在几分钟内有效,并在读取时过期。这个想法是为需要在有效哈希过期之前猜测有效哈希的攻击者限制窗口。