Giả sử chúng tôi có một số API RESTful có tài nguyên bị lộ mà chúng tôi muốn hiển thị. Người dùng cuối sẽ làm việc với API này thông qua các ứng dụng của khách hàng như ứng dụng dành cho thiết bị di động và ứng dụng khách Javascript chạy trên trình duyệt web.Cách xác minh tài nguyên nào mà mỗi người dùng có thể truy cập bằng OAuth và OpenID Connect?
Với OAuth 2.0, API RESTful này sẽ nằm trên Máy chủ tài nguyên và chúng tôi sẽ có một Máy chủ ủy quyền mà trên đó các ứng dụng khách được đăng ký. Sau đó, người dùng sẽ được đăng ký tại máy chủ ủy quyền và có thể cấp quyền cho các ứng dụng đó truy cập tài nguyên nhân danh họ hay không.
Vì vậy, khi người dùng truy cập một ứng dụng khách, anh ta sẽ được chuyển hướng đến Máy chủ ủy quyền và được nhắc cấp quyền cho ứng dụng khách được cho biết. Sau đó một mã thông báo truy cập được phát hành và máy khách có thể thực hiện các yêu cầu tới Máy chủ tài nguyên.
Tất cả điều này khá rõ ràng đối với tôi. Chỉ có một phần còn thiếu: việc bảo vệ mỗi tài nguyên có thể phụ thuộc vào người dùng. Để chính xác hơn, có thể phụ thuộc vào xác nhận quyền sở hữu. Những gì tôi có ý nghĩa bởi đó là chúng ta có thể có các tình huống sau đây:
Nguồn http://resourceserver.com/api/first-resource chỉ nên có thể truy cập cho người dùng với tuyên bố "ExampleClaim" với giá trị 123.
Nguồn http://resourceserver.com/api/second-resource chỉ nên có thể truy cập cho người dùng có xác nhận quyền sở hữu "AnotherClaim" có giá trị 123.
Tài nguyên http://resourceserver.com/api/third-resource phải được mọi người dùng truy cập.
Khi tôi lần đầu tiên nghe nói về OAuth được giao dịch với ASP.NET WebAPI và tôi xử lý với điều đó theo cách sau: khi yêu cầu được gửi với Authorization: Bearer [token]
tiêu đề, trên phía máy chủ hiệu trưởng chủ đề đã được thiết lập và tôi nghĩ rằng điều này có nghĩa là người dùng đã được xác thực với API. Vì vậy, tôi đã sử dụng các thuộc tính [Authorize]
để xác minh xem người dùng có thể truy cập tài nguyên hay không.
Sau khi nghiên cứu sâu hơn về OAuth, tôi thấy đây là một sự lạm dụng sai của giao thức. Như tôi đã biết, OAuth cho phép ứng dụng chứ không phải người dùng. Khi yêu cầu được thực hiện với tiêu đề Cấp quyền, như tôi đã học, mã thông báo truy cập không được chứa thông tin về người dùng, chỉ về ứng dụng được phép thực hiện yêu cầu.
Xem xét việc gửi tiêu đề Cấp quyền với yêu cầu không xác định người dùng và không nói liệu người dùng có thể hoặc không thể truy cập tài nguyên được cho biết.
Trong trường hợp đó, cách thức thực hiện loại ủy quyền này? Ý tôi là, không cho phép ứng dụng khách thực hiện yêu cầu, nhưng ủy quyền của người dùng truy cập tài nguyên dựa trên các xác nhận quyền sở hữu của anh ta? Tôi tin rằng đây là nơi OpenID Connect và mã ID của nó xuất hiện, nhưng tôi không chắc chắn. Làm thế nào để quản lý điều này?
Cảm ơn sự giúp đỡ một lần nữa @TakahikoKawasaki. Tôi nghĩ rằng tôi nhận được nó ngay bây giờ. Cuối cùng, chúng tôi sử dụng mã thông báo truy cập OAuth để có quyền kiểm soát truy cập đối với các ứng dụng của khách hàng: khách hàng nào có thể truy cập tài nguyên nào. Sau đó, từ mã thông báo nhận dạng OpenID Connect, chúng tôi có quyền kiểm soát truy cập đối với người dùng: chúng tôi chọn xác nhận quyền sở hữu chủ đề từ mã thông báo ID xác định người dùng và xem cơ sở dữ liệu nếu người dùng có yêu cầu quyền truy cập tài nguyên. Cuối cùng, thay vì di chuyển xác nhận quyền sở hữu, chúng tôi di chuyển đối tượng bên trong mã thông báo nhận dạng và xác minh các yêu cầu cần thiết khi ủy quyền. Là nó? – user1620696
Đã chỉnh sửa câu trả lời cho nhận xét của bạn. –
Cảm ơn câu trả lời chi tiết @TakahikoKawasaki. Chỉ một điểm, bạn đã nói ở bước 4 "OAuth 2.0 KHÔNG dành cho điều này" và tôi hiểu điều này, vì mục tiêu của OAuth là kiểm soát truy cập đối với các ứng dụng của khách hàng. Vì vậy, có điều gì sai trong việc trích xuất chủ đề từ mã thông báo truy cập như vậy và xác minh các xác nhận quyền sở hữu không? Hay đây là cách làm đúng đắn? Xin lỗi vì rất nhiều nghi ngờ, tôi thực sự không có chuyên gia về bảo mật và tôi chỉ mới bắt đầu với OAuth và OpenID Connect. – user1620696