2012-01-26 17 views
6

Có cách nào để tìm hiểu xem Id phiên có hợp lệ từ trong ngữ cảnh yêu cầu hiện tại không? Trong đó, nếu tôi được cung cấp Id phiên và tôi hiện đang ở phiên khác được bắt đầu bằng Yêu cầu Http và tôi đang ở trên một trang hoặc trong một số lớp, tôi có thể xác thực Id phiên đó không nếu nó hợp lệ và hiện đang tồn tại và không bị bỏ rơi?Trong ASP.Net, tôi có thể tìm hiểu xem một phiên khác tồn tại hoặc có hợp lệ bằng Id phiên không?

Lý do cho điều này là, chúng tôi cần phải khóa quá trình đăng nhập người dùng trên trang cho dự án mà tôi đang làm việc để mọi người dùng chỉ có thể đăng nhập một lần. Suy nghĩ của tôi về điều này là thêm một cột id phiên vào bảng người dùng, nếu nó là null, chúng được đăng xuất, và nó được thiết lập khi họ đăng nhập và xóa khi họ đăng xuất hoặc trên Session_End trong global.asax. Tuy nhiên, nếu vì lý do nào đó mà phiên bị bỏ qua mà không xóa, tôi cần đăng nhập lại, và trong trường hợp đó khi họ đăng nhập và nó tìm thấy Id phiên trong cột đó, tôi nghĩ nó sẽ bằng cách nào đó kiểm tra để xem có phiên Id đang hoạt động và có hiệu lực, nếu không, nó sẽ thiết lập lại nó để Id phiên làm việc mới của họ và cho phép họ đăng nhập.

Cảm ơn

+0

Bạn có cần duy trì phiên của họ mãi mãi không? Nghĩa là ASP .NET cuối cùng sẽ từ bỏ các phiên hết hạn. Nhưng từ quan điểm của người dùng, trạng thái ứng dụng có luôn giữ nguyên không? – Yuck

+0

Chúng tôi không có, chúng tôi có thời gian chờ 30 phút để yêu cầu người dùng đăng nhập lại. Chúng tôi không sử dụng bất kỳ xác thực dựa trên cookie nào, chỉ phiên hoạt động và lưu trữ đối tượng người dùng trong đó. Khi phiên họp hết giờ, chúng "đăng xuất" và phải đăng nhập lại. –

Trả lời

0

không có cách nào trực tiếp chứng thực sessionId. Tùy chọn:

  • Bạn có thể triển khai nhà cung cấp trạng thái phiên của riêng bạn (hoặc có thể là người quản lý ID đủ) để hiển thị thông tin đó (http://msdn.microsoft.com/en-us/library/aa479024.aspx).
  • Chỉ cần cố gắng gian lận bằng cách đặt cookie phiên ID dựa trên ID mà bạn cho rằng người dùng hiện tại sẽ có và hiển thị lại trang. Yêu cầu thứ hai, bạn sẽ có thể xem ID đó có tương ứng với trạng thái hợp lệ và đăng nhập lại nếu cần.

Lưu ý: Tôi sẽ không sử dụng Id phiên cho mục đích đó vì bạn sẽ dựa vào chi tiết triển khai. Có thể chỉ đơn giản từ chối các phiên không giống như mới nhất cho người dùng này sẽ hoạt động. Có thuộc tính "tên phiên hiện tại" của tôi được lưu trong Session["someName"] và trong DB người dùng phải đủ để từ chối hiển thị các phiên cũ hơn.

2

Bạn cần lưu trữ các phiên trong cơ sở dữ liệu để tìm trước đây.
Xem thêm tại HOW TO: Configure SQL Server to Store ASP.NET Session State

+0

Nhận xét trên có tiếng Anh không tốt nhưng ý tưởng đúng. Nếu bạn đã sử dụng máy chủ SQL cho trạng thái phiên của bạn, tôi tin rằng nó lưu trữ ID phiên làm cột. Bạn chỉ có thể kiểm tra điều đó. – Rocklan

1

Cách duy nhất tôi có thể nghĩ là để làm như Neperz nói và lưu trữ các phiên của bạn trong một cơ sở dữ liệu bằng cách sử dụng nhà cung cấp SQLServer phiên, có nghĩa là sau đó bạn có thể sử dụng một truy vấn SQL để xem những gì có sẵn.

Nhưng có một số hãy cẩn thận để xem xét:

  1. tôi tin rằng các ID phiên lưu trữ trong bảng cơ sở dữ liệu phiên không phải là chính xác giống như session ID, bạn có thể truy cập từ mã. Tôi không thể nhớ chính xác nơi tôi đọc nó, nhưng tôi nghĩ rằng tôi đã gặp phải vấn đề này khi tôi đang làm một cái gì đó tương tự để theo dõi tất cả các phiên hoạt động.
  2. Sự kiện Session_End toàn cầu sẽ không bao giờ kích hoạt nếu sử dụng nhà cung cấp phiên SQLServer.
  3. Trừ khi bạn sử dụng rõ ràng Session.Abandon() trong mã của mình để kết thúc phiên (ví dụ: khi người dùng đăng xuất), phiên của bạn có thể treo xung quanh cho đến khi tác vụ SQL Agent xóa sạch mọi phiên hết hạn. Điều này có nghĩa là nếu ai đó chỉ đóng cửa sổ trình duyệt thì phiên của họ sẽ vẫn xuất hiện dưới dạng "hoạt động" có thể làm phức tạp việc triển khai của bạn.
1

Một tùy chọn khác bạn có/đã :-) sẽ được sử dụng WeakReferences:

  • một Dictionary<youruseridtype,WeakReference> được bảo quản ở mức ứng dụng như Application [ "mySessionDictionnary"]
  • khi bắt đầu một phiên làm việc, bạn lưu userid và WeakReference vào đối tượng Session trong Dictionnary
  • khi người dùng muốn đăng nhập, bạn kiểm tra trong Dictionnary cho id của họ. Nếu có một WeakReference không rỗng cho một đối tượng Session, bạn có thể Abandon() đối tượng Session hiện tại, đảm bảo không có nhiều hơn một phiên hoạt động cho mỗi người dùng.

WeakReference đảm bảo rằng bạn sẽ không bị rò rỉ bộ nhớ.

NB: điều này sẽ chỉ hoạt động với quản lý phiên inProc. Do Dictionnary sẽ không tồn tại một ứng dụng khởi động lại, nên nó sẽ giống nhau cho các phiên.

Hy vọng rằng bạn đã tìm thấy câu trả lời đúng cho vấn đề của mình ;-)

Các vấn đề liên quan