2013-10-15 18 views
6

Tôi đang gặp một vấn đề rất thú vị nhưng bực mình. Tôi có một trang MVC 4 chạy với ASP.NET xác thực tiêu chuẩn.IE10 và Windows 8 và ASP.NET MVC (IIS 7)

Chỉ trong kết hợp IE 10 trên Windows 8, khi tôi duyệt qua trang web của mình và điều hướng đến url http từ url https (cả trên cùng một trang), nó tạo ra giá trị asp.net_sessionid khác. Trong mỗi trình duyệt khác/hệ điều hành kết hợp tôi đã thử, điều này dường như không phải là một vấn đề.

Tôi đã tìm kiếm cao và thấp và chắc chắn đã tìm thấy những người gặp sự cố xác thực khác nhau (thường liên quan đến IIS7 không nhận ra IE10 là trình duyệt), tôi chưa tìm thấy ai khác đã xác nhận vấn đề chính xác này. Liên quan nhiều hơn, tôi đã xuất bản một dự án mẫu MVC 'ngoài hộp' và nó có cùng một vấn đề. Tôi không thể là người duy nhất chạy qua vấn đề này (vì vậy tôi hy vọng).

Bất kỳ ai khác đều gặp phải vấn đề này? Hoặc thậm chí chỉ có một số gợi ý?

Cảm ơn

CẬP NHẬT

Được rồi, do đó, thêm một khía cạnh quan trọng. Tôi đang chạy điều này trên một môi trường cân bằng tải. Nếu tôi đẩy các ứng dụng đến một máy chủ duy nhất và kiểm tra, tôi không có vấn đề gì.

+1

thể trùng lặp của [làm thế nào tôi có thể chia sẻ một phiên asp.net giữa http và https] (http: // stackoverflow.com/questions/567535/how-can-i-share-an-asp-net-phiên-giữa-http-và-https) –

+3

Tôi không biết tại sao nó hoạt động trong các trình duyệt khác, nhưng không nên. Trừ khi bạn định cấu hình cookie phiên để bảo mật, chúng sẽ luôn khác nhau giữa http và https. –

+0

Vâng, điểm tốt, nhưng sự hiểu biết của tôi là b/c Tôi đã không đặt cookie của mình thành 'secure = true' so với cookie nên tồn tại giữa https và http. Cho dù đây là thực hành tốt hay không, đó là mong muốn của khách hàng. –

Trả lời

1

Bạn đề cập rằng bạn đã gặp phải sự cố này trong môi trường cân bằng tải, phải không? Tôi giả sử bạn đang sử dụng phương pháp mặc định "Trong Proc" để lưu trữ dữ liệu phiên. Nếu đúng như vậy, thì tôi nghĩ tôi biết chuyện gì có thể xảy ra. (vì lợi ích của đối số, tôi sẽ giả định 2 máy chủ, nhưng nó không thực sự quan trọng nếu bạn có nhiều hơn)

Bạn đang được gửi đến ServerA và một phiên được tạo ra. Bởi vì đây là trong Process ServerB không có ý tưởng về nó. Cuối cùng (và làm thế nào điều đó xảy ra là một vấn đề làm thế nào cân bằng tải của bạn được thiết lập. Chú ý phiên? Cookies? Round robin?) Bạn sẽ được gửi đến ServerB. Vì máy chủ đó có , không có ý tưởng bạn đã có phiên; một cái mới được tạo và bạn được cấp một ID phiên mới.

Vậy tại sao nó xảy ra theo các bước repro chính xác của bạn? Vâng, linh cảm của tôi là có đủ thời gian và tải, bạn sẽ thấy nó chỉ điều hướng từ/page1 đến/page2. Một lần nữa - điều này phụ thuộc vào cách cân bằng tải của bạn được thiết lập, nhưng nó có thể là do bạn đang thay đổi giao thức kích hoạt một cái gì đó và bạn được gửi đến một máy chủ khác trong hồ bơi.

Bạn có thể khắc phục bằng cách nào?
Để bắt đầu, hãy đảm bảo bạn có cùng một khóa máy trong machine.config của mình. Nếu bạn không có quyền truy cập vào đó tôi nghĩ rằng nó sẽ làm việc trong web.config, nhưng tôi đã không thử nó.

Bây giờ, hãy thiết lập một cách khác để lưu trữ trạng thái phiên. Trong Sql Server có lẽ hoặc MySql hoặc Postgres hoặc bất cứ nơi nào. Nếu bạn có SQL Server sẽ dễ dàng nhất kể từ khi trình điều khiển được xây dựng, nhưng nếu bạn có một kho dữ liệu khác, bạn sẽ cần phải xây dựng hoặc tìm một thư viện sẽ thực hiện nó. Tôi đã làm việc trên một dự án mà chúng tôi đã sử dụng Postgres để lưu trữ trạng thái phiên.

Chúng tôi sử dụng npgsql như tài xế conenct đến máy chủ, và xây dựng của chúng tôi riêng PgsqlSessionProvider:SessionStateStoreProviderBase và hooking nó lên thực sự là thực sự dễ dàng

<sessionState mode="Custom" customProvider="PgsqlSessionProvider"> 
    <providers> 
    <add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" /> 
    </providers> 
</sessionState> 
Các vấn đề liên quan