asp.net - 经典 ASP 和 ASP.NET 之间丢失 session

标签 asp.net session asp-classic

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

为了弥补这一点,我们编写了允许在经典 ASP 程序和 ASP.NET 程序之间进行重定向和自动登录的功能。不过,我开始发现 ASP.NET 软件的 session 状态保持存在问题。如果用户使用 ASP.NET 程序,然后在经典 ASP 程序中工作,然后返回到该 ASP.NET 程序,通常情况下,用户对 ASP.NET 程序的身份验证仍然存在,但用户的 session 丢失,从而在程序内执行函数时导致错误。

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

编辑

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

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

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

最佳答案

我也做过与您类似的事情:对从旧版 ASP 应用程序到 ASP.NET 站点的用户进行身份验证。如果您可以提供您所设置的流程的更多详细信息(也许是示例代码),以便对从旧版应用程序转到 ASPX 应用程序的用户执行此操作,那么会有帮助。

为了给您一个简单的了解,在我的实现中,我做了以下操作:

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

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

看看你进展如何?

关于asp.net - 经典 ASP 和 ASP.NET 之间丢失 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2774040/

相关文章:

php - CodeIgniter session 库 - 潜在危险行为?

php - 是否可以在 Drupal 和 ASP&SQL Server 平台之间集成用户数据库?

sharepoint - 用于帮助台的 Powershell 脚本的 Web 前端

java - 如何检测用户是否从其他浏览器登录网站?

asp.net - 最新版本的 Ajax 控制工具包加载 150 个 .axd 文件

c# - 删除方法不起作用

asp.net - Azure 中的 SMTP 指定取件目录?

java - Hibernate 模板关闭事务

.net - 使用经典 ASP 在 Web 场中共享 session

c# - 并非所有参数都在 jquery ajax 调用中发送