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

问题描述:

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

为了弥补,我们编写了允许经典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页面根据userId和日期创建它自己的MD5,它们都通过查询字符串传递。如果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... 

我已经做了类似的事情给你:认证用户从传统的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); 

见你上车与?

+0

我编辑了我的帖子以获取更多信息。 – Aaron 2010-05-05 18:52:53

+0

编辑我自己的帖子作为回应... – Richard 2010-05-05 20:40:48

+0

感谢您的建议...我会试试看,让你知道它是如何工作的。 – Aaron 2010-05-06 13:08:01