2014-07-20 96 views
0

希望有人能幫助我解決這個問題,這個問題一直困擾着我一段時間。FormsAuthentication和會話cookie在Firefox中丟失

我正在建設一個網上商店,我正在與第三方託管的支付系統進行整合。 我讓人們檢查他們的訂單,當他們點擊繼續輸入他們的信用卡信息時,我通過與另一臺服務器上託管的支付系統的安全連接發送給他們,爲他們提供「OK」 - 發送給他們的URL回到我的網站,所以我可以在成功付款後關閉訂單並做一些其他的事情。

問題是在Firefox中,當遠程服務器重定向回我的服務器時,會話標識丟失,表單身份驗證Cookie是完全不同的,導致用戶被註銷。在IE,Safari和Chrome中情況並非如此。從Fiddler2

採取重定向到遠程主機之前

請求發送342個字節的cookie數據的:

ASP.NET_SessionId = uusldflsxdecn0cfkoaw11tx; .ASPXAUTH = 90109DFD47272DDB02905800582D [...] 1878E319DED0DD63BBCA07C1114CD02EA32E7FE3C28BB3ECA07D3EF2131E7425AB6AF4D48777FBE9F965675CA9D0A8CF66AF4433F2CE045ADB419317F9C6F04D32669EF5EB87135B9949EC4462F2826BB6B

遠程主機重定向到我的服務器

請求發送298個字節的cookie數據後:

.ASPXAUTH = A73EE1BE818E1FE934F0AD8D48078E26646318DA24886CAE9 [... ] 23AD63D679D0D838E746DE6357DBE0D3EA32A634873A62F399E1033138648314E83F1282A1949D64F4FC833948F1D3ABA5D997D8CABE3C6CA04256404A25FFC8C3D427A7640B488B01532314EE68

這對我來說似乎很奇怪,我一直無法找到解決辦法。我的做事過程在IE,Safari和Chrome中完美運行..

這是遠程服務器上的問題嗎?有什麼我做錯了嗎? 是否有某種方式重建會話?

從web.config中:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="1440"/> 
</authentication> 
<sessionState mode="InProc" customProvider="DefaultSessionProvider"> 
    <providers> 
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, ..." connectionStringName="DefaultConnection"/> 
    </providers> 
</sessionState> 

回答

0

我仍然不知道爲什麼會出現上述問題,但睡在它之後,我想出了一個非常基本的解決方案。在將用戶重定向到遠程主機之前,我只需將cookie值保存到數據庫中,然後在返回時檢查請求中的cookie值,如果存在差異,我使用數據庫中的值恢復它們。

如果會話密鑰在返回時丟失,但在訪問放入會話中的任何內容(我只是使用RedirectToAction調用)到同一控制器中的另一個操作之前,必須先使用恢復的會話Cookie進行重定向。

private void SaveCookie(int orderId) 
    { 
     var sessionCookie = Request.Cookies.Get("ASP.NET_SessionId"); 
     var authCookie = Request.Cookies.Get(".ASPXAUTH"); 

     var ci = new CookieInformation 
     { 
      OrderId = orderId, 
      SessionCookie = sessionCookie.Value, 
      AuthCookie = authCookie.Value 
     }; 

     Database.SetCookieInformation(ci); 
     Logger.Info("Saved sessionId: " + sessionCookie.Value + " auth: " + authCookie.Value, this.ToString()); 
    } 

而且回國後:

private void RestoreCookies(int orderId) 
    { 
     var reqSessionCookie = Request.Cookies.Get("ASP.NET_SessionId"); 
     var reqAuthCookie = Request.Cookies.Get(".ASPXAUTH"); 

     var savedCookie = Database.GetCookieInformation(orderId); 


     if (reqSessionCookie.Value != savedCookie.SessionCookie || reqAuthCookie.Value != savedCookie.AuthCookie) 
     { 
      Response.Cookies.Clear(); 
      Response.Cookies.Set(new HttpCookie("ASP.NET_SessionId", savedCookie.SessionCookie)); 
      Response.Cookies.Set(new HttpCookie(".ASPXAUTH", savedCookie.AuthCookie)); 
     } 

    }