ASP到ASP.NET会话变量

时间:2012-06-28 18:55:48

标签: asp.net session asp-classic

我们有一个经典asp网站,我们正在慢慢迁移到ASP.NET。

问题当然是经典的asp和ASP.NET如何处理Sessions。在花了最后几个小时研究网络后,我发现了许多文章,但没有一篇文章比其他文章更突出。

是否有将会话变量传递给经典asp和asp.net的最佳实践?安全是必须的,并且非常感谢任何带有示例的解释。

5 个答案:

答案 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仅存储可用于从表中检索数据的唯一标识符。

方法:

  1. 从经典的asp页面中获取所需的会话数据。商店 表中的此数据以及唯一的哈希值和时间戳。
  2. 将哈希值存储在短期cookie中。
  3. 重定向到您需要去的任何页面并读取cookie中的哈希值。
  4. 检查cookie中的哈希值是否未在数据库中过期。如果它有效,请将您需要的数据发回给您的页面,然后使哈希值过期,以便不能重复使用。
  5. 我使用的是SHA 256哈希,它是用户唯一标识符,会话ID和当前时间戳的组合。哈希只有几分钟有效,并在阅读时过期。这个想法是限制攻击者在需要过期之前猜测有效哈希的窗口。