代码之家  ›  专栏  ›  技术社区  ›  Aaron

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

  •  2
  • Aaron  · 技术社区  · 15 年前

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

    为了弥补这个不足,我们编写了允许在经典ASP程序和ASP.NET程序之间重定向和自动登录的功能。不过,我已经开始看到一个问题,即保持ASP.NET软件的会话状态。如果用户使用ASP.NET程序,则在经典的ASP程序中工作,然后返回到该ASP.NET程序,通常情况下,用户对ASP.NET程序的身份验证仍在原位,但用户会话丢失,每当在Pro中执行函数时都会导致错误。克。

    我正在试图捕捉global.asax中会话状态的丢失。 Session_End 事件,它会将用户重定向到登录页,但没有起作用。当用户在经典ASP和ASP.NET之间来回移动并丢失会话时,是否还有其他人面临类似的问题?这就是我真正的问题吗?这是我唯一能看到的问题。

    编辑

    这是我们将用户从经典的ASP页重定向到ASP.NET页的方法。

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

    经典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
    

    重定向.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 回复  |  直到 8 年前
        1
  •  3
  •   Richard    15 年前

    我做了一件类似的事情:验证从旧的ASP应用程序到ASP.NET站点的用户。如果你能提供更多的细节(也许是示例代码),说明你已经设置好的处理过程,从旧版应用程序到ASPX应用程序的用户都能做到这一点,那会有帮助。

    为了给您一个简短的想法,在我的实现中,我做了以下工作:

    • 创建.aspx页
    • .aspx页接受来自特定旧版ASP应用程序的http post值 只有 .
    • 当收到POST请求时,我提取用户名/密码值,然后以正常方式进行身份验证。如果用户已成功通过身份验证,我们将向用户发出FormsAuthentication cookie。

    实际上,我的实现要复杂得多,使用数据库作为后备存储器(因为两个应用程序共享一个公共数据源)和一个特定的数据库字段来存储从经典应用程序发送到.NET端的随机代码,以进一步验证E.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);
    

    看看你是怎么做到的?