2012-04-04 34 views
6

Tôi đang mất ASP.NET_SessionId khi chuyển đổi giữa các trang trên trang web của mình. Sự cố xảy ra trong Chrome/Firefox/Safari. Nó không xảy ra trong IE. Khá kỳ lạ ... đây là kịch bản của tôi.ASP.NET_SessionId bị thiếu

Trang web của tôi có thể được truy cập bằng cách nhập www.example.org hoặc example.org trong trình duyệt (đây là một phần thông tin quan trọng như bạn sẽ thấy).

Tôi nhập example.org. Từ trang chủ của tôi, tôi đăng nhập vào trang web của mình (lưu ý: Tôi không sử dụng xác thực biểu mẫu ASP.NET). Tôi được gửi tới trang người dùng mặc định của mình (ví dụ: userpage.aspx). Từ trang này, tôi nhấp vào một số <a> gửi tôi đến một trang khác trên trang web của tôi. Liên kết <a> đủ điều kiện (ví dụ: http://www.example.org/page2.aspx). Khi tôi được gửi đến trang mới, phiên của tôi bị mất!

Vì vậy, tôi đã chạy Fiddler để thử và khám phá vấn đề. Điều tôi thấy thú vị. Thẻ Tiêu đề yêu cầu Người giới thiệu bị mất giữa các trang.

Sau đây là các bước sau:

  1. Đến example.org.
  2. Đăng nhập vào example.org.
  3. Tôi được chuyển hướng đến userpage.aspx. Người giới thiệu là http://example.org. ASP.NET_SessionId được thiết lập.
  4. Tôi nhấp vào <a> (ví dụ: http://www.example.org/page2.aspx). Sau khi trang được hiển thị, ASP.NET_SessionId bị mất.

Mất ASP.NET_SessionId nhất quán là Chrome/Firefox/Safari. Điều này không xảy ra trong IE.

Nếu lặp lại các bước trên bằng cách thay thế example.org bằng www.example.org, ASP.NET_SessionId sẽ không bị mất. Nó hoạt động, chính xác mỗi lần.

Bất kỳ suy nghĩ nào về hành vi này?

+0

trong fiddler là cookie được gửi qua trong mọi trường hợp hay không? –

+0

những gì bạn đang cố gắng trong mã page2 phía sau? và bạn đang sử dụng chế độ trạng thái phiên InProc? –

Trả lời

6

Thêm phần này vào web.config của bạn dưới <system.web> yếu tố

 
<httpCookies domain=".mysite.com" /> 

Xem nếu có bất kỳ sự thay đổi trong hành vi. Có vẻ như các tên miền phụ không thành công mặc dù tôi nghĩ rằng cookie được đặt tại miền gốc để bắt đầu. điều này sẽ buộc nó theo cách đó.

+0

Tôi nghĩ rằng bạn có thể làm điều gì đó. Cookie chỉ là một bên của phương trình về quản lý trạng thái phiên. Ngoài ra còn có máy chủ. Tôi tin rằng từ quan điểm của IIS, www.mysite.com là một ứng dụng khác với mysite.com. Ngay cả khi chúng trỏ đến cùng một tệp/thư mục vật lý, chúng là các thực thể riêng biệt và phiên được dựa trên httpcontext.current, được liên kết với phạm vi applicaiton hiện tại. (Tôi hy vọng một người nào đó thông minh hơn tôi có thể nói tốt hơn và xác minh xem tôi có đúng không. Tôi có lẽ không phải là vậy. Tôi thực sự chỉ nói điều đó và hy vọng được học.) – David

+0

@DavidStratton tất cả họ sẽ tồn tại trong cùng một hồ bơi ứng dụng. Tất cả tiêu đề máy chủ được định cấu hình sẽ trỏ đến cùng một nhóm ứng dụng. Tôi trường hợp này tôi nghĩ rằng trình duyệt chỉ không gửi cookie trên vì tên miền cookie (vì vậy nó làm việc như thiết kế) Điều quan trọng ở đây (không được ghi chú trong OP) là nếu fiddler cho thấy cookie được gửi qua hay không. –

+0

cảm ơn bạn Điều đó có ý nghĩa. – David

0

Trong trường hợp của tôi sau đây là vấn đề:

Trong môi trường Visual Studio địa phương của tôi, phát triển "web.config" tập tin của tôi đã vô tình chứa đựng những điều sau đây:

<configuration> 
    <system.web> 
     <httpCookies requireSSL="true" /> 
    </system.web> 
</configuration> 

Vì sự phát triển IIS Express chạy tại http://localhost:7561, không phải là HTTPS, séc này được kích hoạt để không đặt/chấp nhận bất kỳ cookie nào, bao gồm cookie ID phiên.

Giải pháp là chỉ cần nhận xét ra đường dây <httpCookies requireSSL="true" />.


khác, vấn đề tương tự tôi có thể tưởng tượng là Content-Security-Policy HTML tag meta, mà cũng controls how cookies are handled, cũng có thể được cấu hình để không cho phép cookie session ID được thiết lập.