2008-11-07 36 views
6

Chúng tôi có API dịch vụ web .NET. Hiện tại, mọi người sử dụng định nghĩa SOAP để tiêu thụ API, bởi vì chúng tôi yêu cầu xác thực thông qua phần tử Xác thực tùy chỉnh trong tiêu đề SOAP. Hoạt động hoàn hảo. khỏe.Cách tốt nhất để xác thực cho dịch vụ web

SOAP yêu cầu yêu cầu phải là POST. Chúng tôi muốn cho phép người dùng sử dụng động từ GET (vì vậy nó có thể được lưu vào bộ nhớ cache).

Vì vậy, cách tốt nhất để cung cấp API GET đơn giản (không phải là dịch vụ web!) Cũng cung cấp xác thực?

dụ tuyến đường API:

http://www.blah.com/api/Search?query=Foo

Đây có phải là một thực tế có thể chấp nhận và phổ biến?

http://www.blah.com/api/Search?query=Foo&Key=<some guid>

LƯU Ý: Tôi cũng không muốn thực hiện SSL cũng không cài đặt thêm phần mềm hay plugin trong IIS, vv vv

Trả lời

1

Nếu dịch vụ web cần phải được bảo đảm, và tôi giả định rằng nó hiện tại vì bạn hiện có một tiêu đề Xác thực, bạn nên xem xét lại việc sử dụng GET và không sử dụng SSL, ít nhất là đối với phần xác thực. Ở mức tối thiểu, tôi sẽ POST yêu cầu ủy quyền thông qua SSL tới dịch vụ/ứng dụng web. Nếu bạn không muốn cung cấp xác thực trên mọi yêu cầu, thì bạn sẽ cần phải chấp nhận lại (và tạo ra trong dịch vụ) một cookie ủy quyền mà người tiêu dùng có thể sử dụng cho các yêu cầu tiếp theo.

Tôi sẽ tránh sử dụng xác thực trong URL vì lý do chính xác mà bạn muốn hỗ trợ GET - nếu URL có thể được lưu trong bộ nhớ cache, thì thông tin xác thực cũng sẽ được lưu trong bộ nhớ cache. Điều này phá vỡ tính bảo mật của dịch vụ web vì bất kỳ ai cũng có thể sử dụng lại thông tin xác thực được lưu trong bộ nhớ cache.

+0

*) Bộ nhớ đệm chỉ nên xảy ra ở phía máy khách .. vì vậy thông tin đăng nhập phải giống nhau. ??? *) Bạn có thể nói thêm về cookie ủy quyền không? –

0

Sử dụng API chỉ GET, tôi sẽ có phương thức đầu tiên tìm nạp ID phiên duy nhất.

Ví dụ: GET/api action = auth & Tên truy nhập = user & password = hashedpassword Would return 16 ký tự dấu hiệu, mà bạn lưu trữ trên mặt của bạn và bạn cần dấu hiệu độc đáo này cho mỗi cuộc gọi tiếp theo.

Nếu API được thực hiện bằng PHP, bạn có thể sử dụng chức năng xử lý phiên của PHP để đạt được điều này (nó có bộ sưu tập thời gian chờ/thu gom rác). Có các chức năng tương tự trong ASP.NET.

Dễ bị tấn công phát lại (ai đó nắm lấy hoặc đoán ID phiên), nhưng nếu bạn muốn một cái gì đó đơn giản, đó là cách để đi. Bất kỳ trang web không phải HTTPS nào cũng sẽ dễ bị tổn thương theo cách tương tự. Bạn có thể liên kết ID phiên với địa chỉ IP của người dùng để bảo mật bổ sung.

0

Nếu bạn đang sử dụng WCF, bạn có thể xây dựng trên cơ chế bảo mật tích hợp sẵn. Nếu bạn không muốn sử dụng các khung tiêu chuẩn để bảo mật, bạn có nhiều khả năng sẽ làm bảo mật bằng cách tối nghĩa.

+0

Tôi đã thử WCF trên một mẫu thử nghiệm cho một dịch vụ web đơn giản. Tôi là một nhà phát triển theo định dạng mã và tất cả cấu hình xml đó đều tắt tôi. Bên cạnh đó, tôi không bao giờ tìm ra cách thêm ủy quyền tùy chỉnh. –

1

Nếu khách hàng của bạn ở trên cùng một miền, bạn có thể bật xác thực Windows tích hợp trong ứng dụng IIS của mình. Ứng dụng của bạn bây giờ sẽ chỉ chấp nhận người dùng được xác thực Windows. Thêm RoleProvider của riêng bạn cho độ chi tiết tốt hơn, dựa trên vai trò.

0

Tương tự như câu trả lời của Thomas Eyde: bạn có thể sử dụng một hệ thống đăng nhập một lần như siteminder để bảo mật URL. Người gọi yêu cầu bao gồm một mã thông báo, thường được lưu trữ trong cookie, nhưng có thể được thêm vào chuỗi truy vấn.

Bất kỳ nền tảng quản lý dịch vụ web hoặc SSO nào đều cố ý làm cho việc xác thực trở nên khó khăn nếu không sử dụng SSL.

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