2013-05-04 29 views
7

Tôi là người mới đối với toàn bộ thế giới SPA phía khách hàng. Tôi đang sử dụng các công nghệ trên, có vẻ khá hứa hẹn. Tuy nhiên, một cú hích lớn mà tôi không thể vượt qua dễ dàng là thiếu bảo mật tích hợp. Tôi phải tự cấp phép ủy quyền người dùng, mà IMHO phải là một phần của khung công tác. Bây giờ tôi đã sắp xếp xong, tôi đang bị đau đầu nghiêm trọng với bảo mật theo chiều dọc: nơi một người dùng đăng nhập nhưng có thể dễ dàng truy cập thông tin của người dùng khác bằng cách thay đổi một vài thông số trong bảng điều khiển của trình duyệt. Tôi có thể chuyển userId với mỗi cuộc gọi và sau đó so sánh nó với một trên máy chủ, nhưng tôi đã hy vọng rằng sẽ có một giải pháp bao quát mà không gây ô nhiễm các cuộc gọi dữ liệu dễ dàng với id người dùng.Hot Towel/Durandal/Breeze.js: làm thế nào để bảo vệ các cuộc gọi dữ liệu theo chiều dọc?

Ví dụ, giả sử có một cú điện thoại từ dịch vụ dữ liệu như thế này:

function getItems(){   
     var query = breeze.EntityQuery.from('Items').expand("Person"); 
     return manager.executeQuery(query); 
} 

này sẽ nhận được tất cả các mục, không tốt. Vì vậy, hãy giới hạn bởi userId:.

function getItems(userId){   
     var query = breeze.EntityQuery.from('Items').where("userId", "==", authentication.userId).expand("Person"); 
     return manager.executeQuery(query); 
} 

trong ví dụ thứ hai, chúng tôi nhận được userId từ dịch vụ xác thực, mà lưu trữ các userId khi người dùng đã đăng nhập Tuy nhiên, một người sử dụng độc hại có thể dễ dàng đi trình duyệt giao diện điều khiển và thay đổi giá trị đó.

Tất nhiên, tôi có thể chuyển userId bằng cách sử dụng withParameters (...) và so sánh nó với một hiện tại trên máy chủ, nhưng tôi phải làm điều đó cho mọi cuộc gọi, điều này có vẻ không đúng. Có cách nào tốt hơn để bảo mật cuộc gọi với id người dùng đáng tin cậy không?

Trả lời

12

@Ali - Tôi hiểu nỗi đau và mối quan tâm của bạn. Bạn có quyền sợ bất kỳ hình thức nào được gọi là bảo mật dựa trên thông tin được chuyển trong URL. May mắn thay có những câu trả lời tuyệt vời cho mối quan tâm của bạn và các ứng dụng Breeze hoạt động tốt với chúng.

Ví dụ: bạn đã nghiên cứu ASP.NET Breeze/Knockout Template chưa? Nó sử dụng Forms Auth để xác thực và bảo vệ bộ điều khiển Web API với thuộc tính [Authorize]. Chỉ những người dùng đã đăng nhập mới có thể truy cập bất kỳ phương thức điều khiển nào.

Xác thực đó cũng đặt IPrincipal trình điều khiển API Web có sẵn thông qua thuộc tính User của nó. Bạn sẽ thấy User được truyền cho hàm tạo của TodoRepository. Trong kho lưu trữ đó, bạn sẽ thấy logic bảo vệ để hạn chế truy vấn và lưu vào chỉ thông tin Todo thuộc về người dùng yêu cầu.

Xem lưu lượng truy cập mạng. Bạn sẽ không tìm thấy bất kỳ thông tin nhận dạng người dùng nào trong URL hoặc các cơ quan yêu cầu/phản hồi. Bạn sẽ thấy một cookie xác thực được mã hóa trong một tiêu đề.

Một lỗ hổng rõ ràng trong ví dụ là lưu lượng khách/máy chủ diễn ra rõ ràng. Bạn phải thêm bảo mật mức truyền tải (HTTPS) trước khi bạn đi vào sản xuất. Nhưng đây là một bản demo sau khi tất cả.

+0

Hi Ward, cảm ơn bạn đã trả lời. Có, tôi đã kết thúc làm một cái gì đó rất giống với những gì bạn đã đề cập (trừ kho lưu trữ cho bây giờ), do đó, tất cả các cuộc gọi được scoped cho người dùng ở phía máy chủ. Tiếp tục công việc tốt :) –

+0

Liên kết trong câu hỏi không còn hoạt động nữa. Có vẻ như vẫn còn một mẫu loại trực tiếp nhưng tôi không thể thấy nội dung Auth @Ward đề cập đến. https://github.com/Breeze/breeze.js.samples/tree/master/net – philreed

2

Tại sao không chỉ thực hiện việc này trong bộ điều khiển? Nếu Web Api được bảo mật bằng [Ủy quyền] thì bạn có thể lấy ID người dùng trong bộ điều khiển và đảm bảo rằng dữ liệu được trả về dành cho người dùng hiện đã đăng nhập.

+0

Như tôi đã nói, tôi biết rằng tôi có thể làm điều đó, tôi chỉ tự hỏi nếu có một số kỹ thuật bao quát để bảo mật mã tốt hơn. Tuy nhiên, làm việc trên phía máy chủ, nó có lẽ không thể làm được cho rằng 'bảo đảm' các cuộc gọi thực sự là ứng dụng cụ thể. –

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