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