2013-08-26 57 views
12

Ứng dụng của tôi có quyền kiểm soát Quyền người dùng, vì không phải tất cả người dùng đều có thể truy cập vào toàn bộ trang web. Tại thời điểm này, tất cả các quyền đó cho một người dùng cụ thể được lưu trữ trong phiên của anh ấy, bởi vì nó sẽ là một vấn đề đối với tôi khi tìm kiếm tại Cơ sở dữ liệu sau mỗi bài viết.Phiên Giết ASP.NET theo Id

Vấn đề là khi tôi xóa quyền, người dùng vẫn có thể truy cập trang và chỉ khi đóng trình duyệt, bản cập nhật có hiệu lực.

Có cách nào để hủy một phiên ứng dụng cụ thể theo ID, buộc người dùng đăng nhập lại không?

+1

Mặc dù nó không chính xác những gì bạn đang tìm kiếm, nếu bạn đang thay đổi quyền thường xuyên, bạn có thể muốn xem xét việc thay đổi độ dài phiên qua thuộc tính Page.Session.Timeout, vì nó được mặc định là 20 phút. – user2366842

+0

Tôi nhận được quan điểm của bạn, nhưng tôi không thể làm điều đó. Các điều khoản không thường xuyên thay đổi, nhưng tôi cần điều đó khi nó xảy ra, bản cập nhật có hiệu lực tại cùng một thời điểm, buộc người dùng phải đăng nhập lại. Thật không may, một số chức năng của người dùng mất quá nhiều thời gian cho anh ta. –

+0

Phương pháp tiếp cận bạo lực nếu bạn đang sử dụng trạng thái trong bộ nhớ là khởi động lại ứng dụng theo các thay đổi quyền ... Lưu ý rằng nó sẽ không hoạt động với các quy trình ngoài quy trình thích hợp như SQL. –

Trả lời

13
"Is there a way to Kill an specific Application Session by the ID, forcing user to Log in again?" 

No. Bạn chỉ có thể truy cập đối tượng Phiên làm việc của người dùng thực hiện yêu cầu hiện tại (ví dụ:), không phải đối tượng phiên khác.

Vì vậy, bạn cần lưu trữ id của người dùng ở một nơi khác, ví dụ như trong bộ sưu tập tĩnh. Khi người dùng thực hiện yêu cầu tiếp theo, bạn có thể kiểm tra xem id có trong bộ sưu tập không và cập nhật quyền hoặc đăng xuất người dùng.

Một giải pháp thay thế khác là giữ các đối tượng quyền của tất cả người dùng hiện đã đăng nhập trong bộ sưu tập tĩnh cũng như trong biến phiên của họ. Bằng cách đó bạn sẽ có thể thay đổi đối tượng quyền mà không cần truy cập đối tượng Session của người dùng đó.

Sử dụng các biến tĩnh trong một ứng dụng web tất nhiên đi kèm với các biện pháp phòng ngừa thông thường. Vì nhiều luồng có thể truy cập nó, quyền truy cập phải được đồng bộ hóa. Ngoài ra, như Alexei Levenkov đã chỉ ra, nếu bạn có nhiều máy chủ, bạn phải giữ cho dữ liệu được đồng bộ hóa giữa các máy chủ.

+0

Cảm ơn @Guffa. Tôi sẽ thử giải pháp của bạn, vì tôi nhận ra rằng tôi không thể truy cập đối tượng Session của người dùng khác. –

+2

+1 trên "không phải đối tượng Session khác" ... Tôi sẽ rất cẩn thận với "Bộ sưu tập tĩnh" cho quyền - như bất kỳ loại bộ nhớ cache nào cần mã để giữ đồng bộ với lưu trữ thực tế/trên máy (nếu có nhiều hơn trên phục vụ trang web). Nó có thể dễ dàng hơn để đạt được hiệu quả của kiểm tra sự cho phép nếu tính chính xác của kiểm tra giấy phép là quan trọng. –

+0

@AlexeiLevenkov: Tốt. Tôi đã thêm một lưu ý về những rủi ro với các biến tĩnh. – Guffa

1

Bạn có thể viết Session.Abandon(); hoặc Session.Clear();

hoặc Session.SessionID[int index];

cửa hàng giá trị phiên người dùng cụ thể trong việc này và sau đó sử dụng Session.Abandon();Session.Clear();

Đối với giết chết một phiên đặc biệt thử sử dụng Session.Remove("key");

+3

Điều này sẽ giết chết toàn bộ phiên, không chỉ một phần cụ thể. –

+0

@KarlAnderson: - Thats chính xác !! Cập nhật câu trả lời của tôi là tốt. Cám ơn vì sự gợi ý!!!!:) –

+1

Có lẽ không phải là kịch bản mà OP có trong đầu - không nhiều người dùng sẽ thực hiện "lấy tất cả các quyền từ tôi", dường như "mất quyền truy cập từ người dùng đó" ... –

-2

Để xóa một phần cụ thể của Session, sau đó sử dụng Session.Remove(), như thứ là:

Session.Remove("YourKey"); 

Lưu ý: Điều này loại bỏ các giá trị và chìa khóa từ Session, trong khi bạn có thể thấy mọi người sử dụng Session["YourKey"] = null; đó sẽ chỉ loại bỏ các giá trị, nhưng để lại chìa khóa. Điều này có thể hoặc không thể là những gì bạn muốn, nhưng chỉ muốn chỉ ra sự khác biệt.