2009-04-03 27 views
7

Một trong những yêu cầu được đề xuất cho một ứng dụng ASP.NET là chúng ta đã vô hiệu hóa Session state trên toàn cầu. (Điều này không thể thương lượng.)Xác thực người dùng không có trạng thái phiên trong ASP.NET

Một yêu cầu khác là chúng tôi có một số phương tiện để xác thực người dùng. Tôi đang nghĩ đến việc sử dụng mô hình nhà cung cấp thành viên của ASP.NET.

Có thể xác thực người dùng mà không có Trạng thái phiên không?

Các ví dụ sử dụng xác thực cụ thể, chúng tôi đang tìm kiếm là:

  • tài đi đến trang web không được thẩm
  • dùng nhập thông tin đăng ký (trường liên lạc, vv)
  • Đối với phần còn lại của phiên của họ , người dùng có quyền truy cập vào một số nội dung nhất định nhờ trạng thái đã đăng ký của họ

Có cách nào để làm điều này với cookie không?

Điều này có thể được thực hiện một cách an toàn, vì vậy không thể dễ dàng giả mạo cookie?

Có tích hợp chức năng trong ASP.NET để hỗ trợ điều này hay chúng ta sẽ cần phải cuộn phương pháp của riêng mình?

Trả lời

12

Xác thực mẫu ASP.NET không sử dụng SessionState. Nó sử dụng một cookie để lưu trữ vé xác thực.

Bạn cũng có thể buộc vé xác thực được gửi qua kênh SSL bằng cách chỉnh sửa tệp web.config.

Tất cả chức năng bạn cần có sẵn trong ASP.NET.

http://msdn.microsoft.com/en-us/library/aa480476.aspx

+0

Tuyệt vời ... có vẻ như tôi cần validationKey và decryptionKey cần phải giống hệt nhau trên tất cả các máy chủ trên trang trại để hoạt động. – frankadelic

+0

nếu bạn đang ở trong một trang trại, vâng. –

0

Có, bạn có thể sử dụng cookie.

Vấn đề với cookie là bạn không thể duy trì nhiều dữ liệu cho chúng. Để đăng ký loại trình thủ thuật, tôi lưu trữ dữ liệu trong cơ sở dữ liệu và sau đó lưu trữ khóa/Id hàng trong cookie được mã hóa. Bằng cách này khi người dùng chuyển sang bước tiếp theo, bạn có thể truy xuất dữ liệu từ cơ sở dữ liệu.

Đối với cookie, bạn có thể dấu thời gian và mã hóa các giá trị cookie. Tôi thường không quản lý trạng thái xác thực của người dùng. Tôi sử dụng các lớp được xây dựng trong FormsAuthentication quản lý khía cạnh đó của các ứng dụng web của tôi.

Các trang web lớn như: Myspace và Live Search Club, chỉ dựa vào cookie là quản lý nhà nước.

2

Chắc chắn, một cookie sẽ thực hiện việc này.

Hãy suy nghĩ về các nguyên tắc cơ bản. Session State được quản lý bằng cookie.

Đây là những gì bạn làm.

Khi đăng nhập, bạn sử dụng userid của họ và hết thời gian chờ (vì vậy thông tin đăng nhập chỉ kéo dài trong 30 phút hoặc bất kỳ thời điểm nào).

Lấy chuỗi đó và băm.

(java, không quan trọng tho)

String cookie = userid + ":" + timeString + ":" + md5(userid + ":" + timeString + ":" + "secretpassword"); 

Sau đó, khi yêu cầu lượt truy cập trang web của bạn, kiểm tra các tập tin cookie. Đầu tiên kiểm tra nó cho tính toàn vẹn.

String parts[] = cookie.split(":"); 
String newHash = md5(parts[0] + ":" + parts[1] + ":" + "secret password"); 
if (!newHash.equals(parts[2])) { 
    // boom, cheater! 
} 

Sau đó kiểm tra chuỗi thời gian để xem liệu chúng có còn "đăng nhập" hay không.

Đảm bảo bạn có thời gian cập nhật cookie theo mọi yêu cầu hay không.

+1

đây là một thực tế khá xấu mặc dù, an ninh khôn ngoan. Nếu mật khẩu bí mật bị rò rỉ khi ai đó có thể đăng nhập vào ứng dụng. Và nếu nó yếu nó có thể bị nứt (đặc biệt là khi MD5 đang mờ dần). Nếu bạn làm theo cách này, ít nhất hãy sử dụng "bí mật" ngẫu nhiên khác nhau cho mọi người dùng. Điều đó sẽ an toàn hơn nhiều. –

+0

Làm cách nào bạn quản lý một phiên khóa cho mỗi người dùng được xác thực khác nhau? – yfeldblum

+0

Đó là một vấn đề kiểm soát chính, bạn có cùng một vấn đề với bất kỳ mã hóa nào. Không thích MD5, hãy chọn SHA. Đó là một ví dụ về kỹ thuật. –

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