Xác thực lập trình cho các lớp được bảo mật của ArcGIS Server thông qua API RESTful


16

Tôi có một phiên bản ArcGIS 10.1 Server hiển thị các dịch vụ bản đồ được bảo mật trên Internet. Nhu cầu của tôi là mã hóa một ứng dụng khách (hiện tôi đang xây dựng bằng phiên bản 3.3 của API Javascript ArcGIS) cho phép người dùng xem các dịch vụ web được bảo mật đó:

Tôi nghĩ ví dụ ESRI trực tuyến này là một khởi đầu tốt.

Tôi sẽ không yêu cầu người dùng nhắc nhở xác thực MACHI dịch vụ bản đồ vì tôi đã biết rằng TẤT CẢ các dịch vụ bản đồ thuộc về anh ấy / anh ấy và do đó anh ấy / anh ấy có thể truy cập được dưới cùng tên người dùng và mật khẩu. Theo ý kiến ​​của tôi, lời nhắc về thông tin đăng nhập sẽ chỉ xuất hiện ONCE và do đó, mã JS sẽ cung cấp thông tin đăng nhập cho từng dịch vụ bản đồ thông qua một số cuộc gọi đăng nhập RESTful. Đối với tôi có vẻ như API REST của ArcGIS Server đang cung cấp một cuộc gọi như vậy ... có lẽ tôi đã sai.

Do đó, cách "RESTful" này để đăng nhập vào các dịch vụ bản đồ được bảo mật có khả thi với ArcGIS Server (giúp truy cập các dịch vụ được bảo mật theo chương trình) không? Nếu vậy, bất kỳ ai trong số bạn có thể cung cấp các ví dụ hoặc liên kết đến tài nguyên web giải thích điều này?


Vui lòng cho chúng tôi biết phiên bản ArcGIS GIS Server (10.0 HOẶC 10.1) ??
Sunil

Sunil, tôi đã quên viết nó, nó là 10.1!
csparpa

1
bạn đang sử dụng cửa hàng bảo mật arcgis chứ không phải windows auth?
Brad Nesom

@Brad Nesom hiện tại đối tượng ArcGIS Server của tôi đang sử dụng cửa hàng bảo mật tích hợp (có người dùng và vai trò), nhưng tôi dự định liên kết phiên bản với máy chủ LDAP bên ngoài cho mục đích xác thực
csparpa

Câu trả lời:


11

Cuối cùng tôi đã tìm thấy thứ mà tôi đang tìm kiếm: một điểm cuối web ArcGIS Server thích hợp mà tôi có thể sử dụng để tạo mã thông báo!

Cuộc gọi này là:

GET http://<arcgisserver_host:port>/arcgis/tokens?request=getToken&username=<usr>&password=<usr>&expiration=<token_lifespan>

sẽ trả lại mã thông báo vào phần thân phản hồi HTTP và người ta có thể gửi nó theo bất kỳ yêu cầu nào khác đến các tài nguyên được bảo mật mà không cần được nhắc lại thông tin đăng nhập. Mã thông báo phải là giá trị cho Cookietiêu đề yêu cầu, vì hiện tại nó được lưu trữ vào cookie ở phía máy khách.

Nhưng ... chết tiệt ! Trình tạo mã thông báo này KHÔNG phải là một phần của API REST của ArcGIS Server !!! Tôi không thể tìm thấy nó trong tài liệu API trực tuyến ! Tôi có thể tìm thấy nó ở đâu trên thế giới ???

Điều này có nghĩa là ArcGIS Server không có khung xác thực RESTful.

Ví dụ: nếu chúng tôi có dịch vụ bản đồ này được hiển thị theo API REST của ArcGIS: /arcgis/rest/services/myDir/myMapService/MapServer/layersvà chúng tôi cố gắng NHẬN tài nguyên này, những gì chúng tôi nhận được từ ArcGIS Server là một phản hồi có 200: OKmã trạng thái và tài liệu HTML trong phần thân (HTML là một dạng đăng nhập ). Từ thông tin đăng nhập REST -be-RESTful, tôi hy vọng rằng yêu cầu đã cung cấp cho tôi 401: Authentication Requiredmã trạng thái cùng với WWW-Authenticatetiêu đề ... Tôi đã tự mình kiểm tra toàn bộ điều này bằng chương trình máy khách REST.


3
Đáng buồn thay, hầu hết các triển khai "RESTful" không phải là RESTful :) Vài năm trước tôi đã từ bỏ việc cực kỳ nghiêm ngặt về vấn đề này bởi vì sự thật là hầu hết các triển khai đều "giống như REST". Đối với trường hợp sử dụng cụ thể của bạn, tôi thường có một cách tiếp cận khác. Tôi sử dụng hệ thống xác thực tích hợp sẵn và các yêu cầu ArcGIS mở proxy. Vì vậy, nếu tôi đang xử lý xác thực với sự xác nhận của Django, hoặc của ruby, hoặc .net hoặc bất cứ điều gì, tôi sử dụng hệ thống đó. Sau đó, khi hệ thống đó báo là ổn, bạn có thể ủy quyền các yêu cầu đến máy chủ / cổng ArcGIS nội bộ bị khóa trong thế giới bên ngoài.
Ragi Yaser Burhum

2
Xin chào @Ragi Yaser Burhum, bạn đã đúng: chúng tôi sẽ không bao giờ sống trong một thế giới RESTful đầy đủ ;-) Tôi cũng đã xem xét một cách tiếp cận như của bạn: Tôi thích ý tưởng có proxy (cũng có thể xử lý các yêu cầu đối với các dịch vụ web khác ngoài ArcGIS Server , cũng vậy) nhưng tôi đang cần giữ sự phức tạp của toàn bộ kiến ​​trúc càng thấp càng tốt. Vì vậy, sau khi phát hiện ra rằng có một cách thẳng thắn để xác thực người dùng theo chương trình dịch vụ bản đồ, tôi sẽ đi bộ! Dẫu sao cũng xin cảm ơn!
csparpa

Có thể đây là câu hỏi quá cũ, nhưng hy vọng bạn có thể thấy API Esri REST hiện có phương thức GenerateToken: resource.arcgis.com/en/help/arcgis-rest-api/index.html#//
Thay

7

Vui lòng xem cách ArcGIS Server Security hoạt động.

Về cơ bản, bạn sẽ cần tạo người dùng và nhóm và cung cấp một quyền Người dùng cụ thể đối với các dịch vụ nhất định.

Khi bạn đã thực hiện điều đó, thì bạn cần sử dụng bảo mật dựa trên Token trong Ứng dụng JavaScript của mình. Điều này có nghĩa là gì, bạn hỏi Người dùng cho Tên người dùng và mật khẩu của họ. Điều đó được gửi đến Máy chủ ArcGIS, xác nhận Thông tin xác thực và gửi lại mã thông báo. Mã thông báo này được sử dụng để xác thực người dùng bất cứ khi nào tài nguyên được yêu cầu.

Bạn là một lập trình viên sẽ gửi mã thông báo này đến mọi dịch vụ bản đồ, dịch vụ truy vấn, v.v.

Trang này chi tiết cách sử dụng Dịch vụ dựa trên mã thông báo .

API Javascript ArcGIS đã đi kèm với một Class, IdentityManager để làm điều này.

Dưới đây là một vài mẫu về cách sử dụng Trình quản lý danh tính.


3

Trong API ArcGIS cho JavaScript, có một tiện ích được gọi là Trình quản lý danh tính giải quyết chính xác những gì bạn muốn làm. Kiểm tra các mẫu sử dụng trình quản lý danh tính để xem nó hoạt động như thế nào.

Mẫu được liên kết bởi Devdatta, trong khi hợp lệ, là cách thức của Trình quản lý danh tính trước để thực hiện việc này và liên quan đến nhiều mã cần thiết hơn bây giờ khi xác thực cho các dịch vụ bảo mật được đưa vào API.


1
Tôi vừa lấy liên kết mẫu cho tài liệu của ESRI. Tài liệu có thể được cập nhật để trỏ đến các mẫu mới?
Devdatta Tengshe

2
Các bạn, cảm ơn vì những gợi ý của bạn nhưng tôi nghĩ bạn đã không hiểu ý tôi. Kịch bản là: người dùng của tôi sẽ truy cập N dịch vụ bản đồ được bảo mật, điều đó có nghĩa là anh ta sẽ bị làm phiền N lần với một dấu nhắc đăng nhập. Vì TẤT CẢ các dịch vụ bản đồ của người dùng có thể được truy cập bằng cùng một thông tin đăng nhập, tôi muốn ứng dụng của mình yêu cầu CHỈ MỘT LẦN cho họ và sau đó sử dụng chúng để tự động xác thực từng dịch vụ bản đồ. Ở giai đoạn này, tôi đoán rằng tôi nên sử dụng trang proxy để xử lý nhiều auth dịch vụ bản đồ với ArcGIS Server. Nghe có vẻ hay? Bất kỳ thay thế thẳng hơn? Cảm ơn trước, hy vọng tôi đã làm rõ nhu cầu của mình ..
csparpa

2

Bạn cũng có thể sử dụng Proxy, vì vậy ứng dụng của bạn sẽ không bao giờ nhắc nhập Tên người dùng và Mật khẩu. Và bạn không cần đặt Token để truy cập các dịch vụ được bảo mật bất cứ khi nào bạn truy cập chúng. Điều duy nhất bạn cần làm là trong tệp JS của bạn, đặt như sau: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (ví dụ : http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; Và trong tệp proxy.config của bạn, hãy cung cấp tất cả các dịch vụ mà bạn đang sử dụng trong ứng dụng của mình.
Tham khảo https: //github.com/Esri/resource-proxy/ để biết thêm chi tiết về proxy. Khi bạn muốn xác thực dựa trên mã thông báo, trong tệp proxy.config, bạn chỉ cần thêm url, tên người dùng, mật khẩu và nội dung trùng khớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.