2013-10-15 73 views
6

我有一個非常有趣,但令人沮喪的問題。我有一個運行標準ASP.NET身份驗證的MVC 4網站。IE10和Windows 8和ASP.NET MVC(IIS 7)

當且僅當在Windows 8上的IE 10的組合中,當我遍歷我的站點並導航到來自https url(都在同一站點上)的http url時,它會生成不同的asp.net_sessionid值。在我嘗試過的每個其他瀏覽器/操作系統組合中,這似乎不成問題。

我已經搜索了高和低,雖然我當然發現人們遇到各種身份驗證問題(通常關於IIS7不承認IE10作爲瀏覽器),我還沒有發現任何人聲稱遇到這個確切的問題。更多關注,我發佈了一個「開箱即用」的MVC模板項目,它也有同樣的問題。我不可能是唯一一個遇到這個問題的人(所以我希望)。

其他人碰到過嗎?或者,甚至只是有一些建議?

感謝

UPDATE

好了,還有一個更重要的方面。我在一個負載平衡的環境中運行它。如果我將應用程序推送到單個服務器並進行測試,那麼我沒有任何問題。

+1

可能重複HTTP和https](http:// stackoverflow。COM /問題/ 567535 /何燦的i-共享的-ASP淨會話間的HTTP和HTTPS) –

+3

我不知道爲什麼它的工作在其他瀏覽器,但它不應該是。除非您將會話cookie配置爲安全,否則它們在http和https之間始終會有所不同。 –

+0

呀,好點,但我的理解是B/C我是不是我的cookie設置爲與餅乾「安全=真正的」應該與HTTPS和HTTP持續。這是否是好的做法,這是客戶的願望。 –

回答

1

你提到你在負載平衡的環境中有這個問題,對吧?我假設你正在使用存儲會話數據的默認「In Proc」方法。如果是這樣的話,那麼我想我知道會發生什麼。 (爲了爭辯,我將假設2臺服務器,但是如果你有更多的服務器並不重要)

你被髮送到ServerA並創建一個會話。因爲這是在進程中ServerB不知道它。最終(以及發生的方式是如何設置您的負載均衡器的問題。粘滯會話?Cookie?循環?),您將被髮送到ServerB。因爲該服務器有不知道你已經有一個會話;會創建一個新的會話ID並給您一個新的會話ID。

那麼,爲什麼它在你的確切的repro步驟下發生?那麼,我的直覺是,如果有足夠的時間和負載,你會看到它只是從/ page1導航到/ page2。再次 - 這取決於您的負載均衡器是如何設置的,但可能是因爲您正在更改觸發某些內容的協議,並將您發送到池中的另一臺服務器。

如何解決?
要開始,請確保您的machine.config中具有相同的機器密鑰。如果你沒有訪問權限,我認爲它會在web.config中工作,但我沒有嘗試過。

現在,建立另一種存儲會話狀態的方式。在Sql Server或者MySql或者Postgres或者任何地方。如果你擁有SQL Server,它將是驅動程序構建以來最簡單的,但是如果你有另一個數據庫,你需要構建或者找到一個能夠實現它的庫。我參與了一個使用Postgres存儲會話狀態的項目。

我們使用npgsql作爲駕駛員conenct到服務器,並建立了自己的PgsqlSessionProvider:SessionStateStoreProviderBase和掛鉤起來其實是很容易的

<sessionState mode="Custom" customProvider="PgsqlSessionProvider"> 
    <providers> 
    <add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" /> 
    </providers> 
</sessionState> 
[我怎麼可以共享一個asp.net會話之間的