2010-05-05 61 views
2

我工作的公司正在爲我們的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... 

回答

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); 

見你上車與?

+0

我編輯了我的帖子以獲取更多信息。 – Aaron 2010-05-05 18:52:53

+0

編輯我自己的帖子作爲迴應... – Richard 2010-05-05 20:40:48

+0

感謝您的建議...我會試試看,讓你知道它是如何工作的。 – Aaron 2010-05-06 13:08:01