2009-11-04 27 views
10

Tôi đang chuyển một ứng dụng ASP.NET sang MVC và cần lưu trữ hai mục liên quan đến người dùng tự động: danh sách vai trò và danh sách ID mục hiển thị, để xác định những gì người dùng có thể hoặc không thể nhìn thấy.Vai trò người dùng - tại sao không lưu trữ trong phiên?

Trước đây chúng tôi đã sử dụng WSE với dịch vụ web và điều này làm cho mọi thứ trở nên phức tạp và không thể gỡ lỗi đúng cách. Bây giờ chúng tôi đang bỏ dở dịch vụ web, tôi đang tìm kiếm foward để đơn giản hóa giải pháp đơn giản để lưu trữ những thứ này trong phiên. Một đồng nghiệp đã đề xuất sử dụng vai trò và nhà cung cấp thành viên nhưng khi xem xét vấn đề này, tôi đã tìm thấy một số vấn đề:

a) Vấn đề tương tự nhưng khác với WSE ở chỗ nó phải được sử dụng một cách rất hạn chế maing nó khó khăn thậm chí để viết các bài kiểm tra;

b) Tùy chọn bộ nhớ đệm duy nhất cho RolesProvider dựa trên cookie mà chúng tôi đã từ chối trên cơ sở bảo mật;

c) Không giới hạn các biến chứng và hành lý không mong muốn thêm;

Tất cả những gì chúng ta muốn làm, tóm lại, lưu trữ hai biến chuỗi trong phiên của người dùng hoặc một thứ tương tự một cách an toàn và tham chiếu đến chúng khi cần. Gì có vẻ là cho đến nay một công việc mười phút đã đưa ra vài ngày điều tra và hợp chất vấn đề bây giờ chúng tôi đã phát hiện ra rằng sử dụng session IDs rõ ràng có thể được làm giả, xem

http://blogs.sans.org/appsecstreetfighter/2009/06/14/session-attacks-and-aspnet-part-1/

Tôi suy nghĩ trái có không có cách nào dễ dàng để làm công việc này rất đơn giản, nhưng tôi thấy rằng không thể tin được.

Ai có thể:

a) cung cấp thông tin đơn giản về cách tạo các phiên ASP.NET MVC an toàn như tôi luôn tin?

b) đề xuất một cách đơn giản khác để lưu trữ hai biến chuỗi này cho vai trò của người dùng đã đăng nhập v.v. mà không phải thay thế một cơn ác mộng phức tạp với một điều khác như được mô tả ở trên?

Cảm ơn bạn.

Trả lời

0

Cách duy nhất để thực hiện an toàn cinnection là sử dụng SSL. Bất cứ điều gì ít hơn thế, và bạn chỉ cần thực hiện đánh giá khi nó "đủ an toàn".

Biến phiên hoạt động tốt để lưu trữ giá trị, ngoại trừ việc máy chủ web có thể được tái chế ngay bây giờ và sau đó, điều này sẽ khiến phiên bị mất. Khi điều đó xảy ra, bạn sẽ phải xác thực lại người dùng và đặt lại biến phiên.

Biến phiên chính nó là hoàn toàn an toàn theo nghĩa là nó không bao giờ rời khỏi máy chủ trừ khi bạn đặc biệt sao chép nó vào một phản ứng.

+0

Tôi nên nói, chúng tôi sử dụng SSL nên không có vấn đề gì ở đó. Ngoài ra, chúng tôi chưa bao giờ gặp vấn đề với việc tái tạo các phiên vì vậy tôi không lo lắng về điều đó. – Phil

+0

Đối với các biến phiên hoàn toàn an toàn: đó là những gì tôi nghĩ nhưng bài viết tôi đã liên kết cho thấy rằng người dùng có thể lừa người dùng tham gia phiên hiện tại, theo nhiều cách khác nhau và chia sẻ nó với người dùng đã xác thực. và do đó lưu trữ tất cả các vai trò riêng của họ trong đó để người khác sử dụng. Giải pháp hiển nhiên cho điều đó là lưu trữ địa chỉ IP trong phiên và kiểm tra nó mỗi lần nhưng dường như rất dễ giả mạo trong yêu cầu đó. Trong khi tôi đã không thể thực hiện bất kỳ cách nào được đề xuất của – Phil

+0

tham gia một công việc phiên hiện tại tôi muốn biết lý do tại sao họ không chỉ dựa vào kỹ năng rõ ràng của tôi thiếu là một hacker. Nếu tôi tự tin về điều đó thì tôi nghĩ chúng tôi đã giải quyết được vấn đề nhưng cho tới giờ tôi vẫn chưa. – Phil

0

Bạn đã cân nhắc thiết lập thẻ Ủy quyền tùy chỉnh trong MVC chưa. Tôi đã đưa ra một ví dụ về điều này trong một số khác question.

Khi ủy quyền ban đầu (màn hình đăng nhập hoặc bắt đầu phiên), bạn cũng có thể thêm giá trị phiên với địa chỉ IP. Sau đó, trong ủy quyền tùy chỉnh của bạn, bạn cũng có thể xác minh rằng IP vẫn khớp với nhau. Điều này sẽ giúp đảm bảo rằng ai đó không 'ăn cắp' phiên của người đó. Mỗi lần bạn truy cập dữ liệu phiên của bạn chỉ cần đảm bảo chuyển IP của người yêu cầu và có một số kiểm tra trên đó.

0

Bạn có đang cố gắng kiểm soát quyền truy cập vào các chức năng ở cấp độ khách hàng không? Đó là lý do duy nhất tôi để lộ vai trò và vật phẩm để kiểm soát các chức năng phụ của khách hàng. Ngoài ra, bạn có thể tạo ra một chức năng để có được các mục mà vai trò của người dùng được phép sử dụng, và sau đó ngay cả khi chức năng được gọi bên ngoài các mục được đưa trở lại ứng dụng web, bạn có thể ngăn chặn người dùng truy cập chúng.

4Guys dường như cho biết cách kiểm soát các chức năng với vai trò.

0

Cách tiếp cận tôi đã sử dụng trong quá khứ là sử dụng mã hóa đối xứng của cookie cùng với SSL. Mã hóa thông tin người dùng trong phản hồi và giải mã nó trong yêu cầu. Tôi không tuyên bố điều này là dễ dàng hoặc 100% an toàn và tôi sẽ không muốn làm điều này trên một ứng dụng ngân hàng, nhưng nó là đủ tốt cho nhiều mục đích.

Vấn đề chính với biến phiên là nếu bạn lưu chúng trongProc thay vì lưu giữ chúng, thì bạn cần áp dụng các phiên 'dính' cho cân bằng tải của bạn trong môi trường trang trại. Guffa là chính xác mà không có biến phiên kiên trì này đôi khi sẽ bị mất gây ra trải nghiệm người dùng kém.

Các phiên cố định có thể dẫn đến cân bằng tải không đồng đều, có thể làm giảm giá trị của việc có thể mở rộng quy mô.

Nếu bạn sẽ kiên trì các phiên để có thể truy cập tất cả các máy chủ trong trang trại của bạn, bạn có thể sử dụng Hướng dẫn để xác định người dùng, mã hóa mã này trong cookie và truy xuất hồ sơ người dùng từ kho dữ liệu của bạn mỗi lần.

0

Câu hỏi rõ ràng của tôi là tại sao bạn muốn lưu trữ vai trò của người dùng trong phiên?

Đây là câu trả lời của tôi cho truy vấn của bạn, cách thức này giúp ích. Tôi đã đính kèm một ứng dụng demo nhỏ để bạn có thể xem và hiểu điểm của tôi. Khi bạn mở dự án này trong studio trực quan, hãy nhấp vào tab dự án ở trên cùng và chọn cấu hình asp.net. Từ trang sẽ hiển thị, bạn có thể thực hiện công cụ quản trị người dùng.

Bạn cần lưu trữ vai trò của người dùng một cách an toàn? Câu trả lời cho câu hỏi này là bạn không cần lo lắng về việc lưu trữ vai trò cho bất kỳ người dùng nào, khi chúng tôi có tư cách thành viên asp.net, hồ sơ và khung vai trò để giúp chúng tôi thực hiện điều này. Tất cả những gì bạn cần làm là tạo một vai trò trong cơ sở dữ liệu aspnet và gán vai trò đó cho người dùng.

Tiếp theo, bạn muốn lưu trữ hai chuỗi theo cách an toàn. Tôi đề nghị bạn sử dụng hồ sơ để lưu trữ thông tin cụ thể của người dùng. Bằng cách này, bạn có thông tin có sẵn cho bạn ở bất cứ nơi nào bạn muốn từ lớp profilecommon.

Cũng xin vui lòng xem ứng dụng demo gắn liền đặt ở phần cuối của blog của tôi http://blogs.bootcampedu.com/blog/post/Reply-to-httpstackoverflowcomquestions1672007user-roles-why-not-store-in-session.aspx

7

Lưu trữ thông tin vai trò của người dùng trong một phiên phía máy chủ là an toàn cung cấp một phiên không thể bị bắt cóc. Việc khôi phục vấn đề này rộng hơn, không quan trọng nơi thông tin vai trò của người dùng được lưu trữ nếu một phiên được xác thực bị tấn công.

Tôi khuyên bạn không nên đặt quá nhiều niềm tin vào bài viết mà bạn đã liên kết, nhưng báo cáo cổ điển năm 2002 được liên kết đến từ liên kết của bạn được quan tâm. Dưới đây là các take-aways của tôi:

  1. Không chấp nhận ID phiên được nhúng trong URL.

  2. Tập trung thời gian của bạn vào việc loại bỏ các mối nguy hiểm tập lệnh trên trang web, tức là quét tất cả dữ liệu do người dùng cung cấp và phân tích cú pháp tập lệnh java thực thi.

  3. cookie Issue cho các tên miền đầy đủ (ví dụ myapp.mydomain.com)

  4. Máy chủ tên miền của bạn tại một nhà điều hành cao cấp DNS ví dụ cái mà chỉ cho phép thay đổi DNS từ địa chỉ IP từ xa được đặt trước.

  5. Không phát hành cookie phiên liên tục.

  6. Phát hành lại cookie phiên nếu ai đó đến trang đăng nhập có sessionID đã được liên kết với phiên được xác thực.

  7. Vẫn còn tốt hơn, luôn phát hành cookie phiên mới về xác thực thành công và từ bỏ phiên trước đó. (Điều này có thể được cấu hình trong IIS?)

0

Chỉ cần một gợi ý, bạn có thể cân nhắc sử dụng thư viện nhỏ này:

http://www.codeproject.com/KB/aspnet/Univar.aspx

Nó có một thi phía máy chủ của cookie theo đó tất cả các cookie có thể được lưu trữ trên máy chủ trong khi xác thực asp.net được sử dụng để xác định người dùng. Nó hỗ trợ mã hóa và cũng rất linh hoạt làm cho nó rất dễ dàng để chuyển đổi từ một loại lưu trữ khác.

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