经典ASP和ASP.NET之间的会话丢失

时间:2010-05-05 14:23:48

标签: asp.net session asp-classic

我工作的公司正在为我们的Intranet软件在经典ASP程序和ASP.NET程序之间进行转换。最终,所有内容都将使用ASP.NET编写,但由于时间限制,仍有许多程序使用经典ASP。

为了补偿我们编写的功能,允许在经典ASP程序和ASP.NET程序之间进行重定向和自动记录。不过,我已经开始看到一个问题,即保持ASP.NET软件的会话状态。如果用户使用ASP.NET程序,然后在经典ASP程序中工作,然后返回到该ASP.NET程序,通常,用户对ASP.NET程序的身份验证仍然存在,但是用户的会话丢失,导致在程序中执行功能时出错。

我正在尝试捕获global.asax的Session_End事件中会话状态的丢失,这会将用户重定向到登录页面,但这没有用。有没有其他人遇到类似的问题,用户在经典ASP和ASP.NET之间来回移动和丢失会话?这甚至是我真正的问题吗?这是我唯一能看到的问题。

修改

我们这样做是为了将用户从经典的asp页面重定向到ASP.NET页面。

我们根据userID和日期创建MD5哈希,并通过查询字符串将其发送到redirect.aspx页面。从那里,aspx页面创建自己的MD5基于userId和日期,两者都通过查询字符串传递。如果2个哈希值相同,则对用户进行身份验证,然后加载程序。这是一个例子:

经典ASP:

strDate = Year(Now())  & right("0" & Month(Now()), 2) & right("0" & Day(Now()), 2)
key = MD5(SessionUserID & strDate)
Response.Redirect "/redirect.aspx?key="&key&"&lpid="&ProgramID&"&unum="&SessionUserNum&"&uid="&SessionUserID&"&gid="&SessionGroupID

Redirect.aspx:

string key = Request.QueryString["key"];
//SetDesignModeState Variables:
if (getMd5Hash(Request.QueryString["uid"] + DateTime.Today.ToString("yyyyMMdd")) == key)
{
    Session["SessionGroupID"] = Request.QueryString["gid"];
    Session["SessionUserNum"] = Request.QueryString["unum"];
    Session["SessionUserID"] = Request.QueryString["uid"];
    string appID = Request.QueryString["lpid"];
    FormsAuthentication.SetAuthCookie(Request.QueryString["uid"], false);
    //redirect to ASP.NET page...

1 个答案:

答案 0 :(得分:3)

我对你做了类似的事情:将用户从旧版ASP应用程序验证到ASP.NET站点。有用的是,如果您可以提供更多详细信息(可能是示例代码),您可以使用旧版应用程序向ASPX应用程序执行此操作。

为了简要介绍一下,在我的实施中,我做了以下几点:

  • 创建.ASPX页面
  • .ASPX页面仅接受来自特定旧版ASP应用的HTTP POST值。
  • 收到POST请求后,我提取用户名/密码值,然后以正常方式继续进行身份验证。如果用户成功通过身份验证,我们会向用户发出FormsAuthentication cookie。

实际上,我的实现相当复杂,使用数据库作为后备存储(因为两个应用程序共享一个公共数据源)和一个特定的数据库字段来存储从经典应用程序发送到的随机代码.NET方面进一步验证.NET应用程序收到的请求是否有效。

修改

尝试手动设置身份验证Cookie。删除该行:

FormsAuthentication.SetAuthCookie(Request.QueryString["uid"], false); 

替换为:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                Request.QueryString["uid"],
                DateTime.Now,
                DateTime.Now.AddHours(24),
                false,
                null)

        string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);            
        HttpContext.Current.Response.Cookies.Add(cookie);

看看你如何继续?