我工作的公司正在为我们的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...
答案 0 :(得分:3)
我对你做了类似的事情:将用户从旧版ASP应用程序验证到ASP.NET站点。有用的是,如果您可以提供更多详细信息(可能是示例代码),您可以使用旧版应用程序向ASPX应用程序执行此操作。
为了简要介绍一下,在我的实施中,我做了以下几点:
实际上,我的实现相当复杂,使用数据库作为后备存储(因为两个应用程序共享一个公共数据源)和一个特定的数据库字段来存储从经典应用程序发送到的随机代码.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);
看看你如何继续?