Программная аутентификация на защищенных слоях ArcGIS Server через RESTful API

16

У меня есть экземпляр ArcGIS 10.1 Server, который предоставляет защищенные картографические сервисы в Интернете. Мне нужно написать код клиентского приложения (которое я сейчас создаю с использованием версии 3.3 ArcGIS Javascript API), позволяющего пользователю просматривать эти защищенные веб-сервисы:

Я думаю, что этот онлайн-пример ESRI - хорошее начало.

Я не хочу, чтобы пользователь запрашивал КАЖДУЮ аутентификацию mapservice, потому что я уже знаю, что ВСЕ картографические услуги принадлежат ей / ему и поэтому доступны ему / ей под тем же именем пользователя и паролем. По моей идее, запрос учетных данных должен отображаться только ОДИН РАЗ, и поэтому код JS должен передавать учетные данные каждому из картографических сервисов через своего рода вызов входа в RESTful. Мне не кажется, что ArcGIS Server REST API обеспечивает такой вызов ... возможно, я ошибаюсь.

Следовательно, возможен ли этот «RESTful» способ входа в защищенные картографические сервисы с помощью ArcGIS Server (позволяющий программно получать доступ к защищенным сервисам)? Если да, может ли кто-нибудь из вас предоставить примеры или ссылки на веб-ресурсы, объясняющие это?

csparpa
источник
Пожалуйста, дайте нам знать версию ArcGIS GIS Server (10.0 ИЛИ 10.1) ??
Сунил
Сунил, я забыл написать, это 10,1!
csparpa
1
Вы используете ArcGIS Security Store, а не Windows Auth?
Брэд Несом
@Brad Nesom на данный момент мой экземпляр ArcGIS Server использует встроенное хранилище безопасности (с пользователями и ролями), но я планирую связать экземпляр с внешним сервером LDAP для целей аутентификации
csparpa

Ответы:

11

Я наконец-то нашел то, что искал: подходящую конечную точку веб-сервера ArcGIS Server, которую я мог бы использовать для генерации токенов!

Вызов такой:

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

который возвращает токен в тело ответа HTTP, и его можно отправить вместе с любым дальнейшим запросом к защищенным ресурсам без повторного запроса учетных данных. Токен должен быть значением для Cookieзаголовка запроса, так как он в настоящее время хранится в файле cookie на стороне клиента.

Но ... черт ! Этот генератор токенов НЕ является частью API REST ArcGIS Server !!! Я не смог найти его в онлайн-документации по API ! Где в мире я мог найти это ???

Это означает, что ArcGIS Server не имеет инфраструктуры аутентификации RESTful.

Например, если у нас есть этот mapservice, предоставляемый через ArcGIS REST API: /arcgis/rest/services/myDir/myMapService/MapServer/layersи мы пытаемся получить этот ресурс, то мы получаем от ArcGIS Server ответ с 200: OKкодом состояния и HTML-документом в теле (HTML-это форма входа в систему). ). От ожидаемого входа в RESTful я бы ожидал, что запрос вернул мне 401: Authentication Requiredкод состояния вместе с WWW-Authenticateзаголовком ... Я сам все это проверил, используя клиентскую программу REST.

csparpa
источник
3
К сожалению, большинство "RESTful" реализаций не являются RESTful :) Несколько лет назад я перестал быть сверхстрогим по этому поводу, потому что правда в том, что большинство реализаций "REST-подобны". Для вашего конкретного случая использования я обычно использую другой подход. Я использую встроенную систему аутентификации и прокси открытые запросы ArcGIS. Так что, если я занимался аутентификацией с помощью аутентификации Django, ruby, .net или чего-то еще, я использую эту систему. Затем, когда эта система говорит, что все в порядке, вы можете передавать запросы на внутренний сервер / порт ArcGIS, который заблокирован от внешнего мира.
Раги Язер Бурхум
2
Привет @Ragi Yaser Burhum, вы правы: мы никогда не будем жить в полностью RESTful мире ;-) Я также рассмотрел такой подход, как ваш: мне нравится идея иметь прокси (который также мог бы обрабатывать запросы к веб-сервисам, отличным от ArcGIS Server) тоже) но мне нужно, чтобы сложность всей архитектуры была как можно ниже. Итак, обнаружив, что существует прямой способ программной аутентификации пользователей на mapservices, я пойду по нему! Спасибо, в любом случае!
csparpa
Возможно, это слишком старый вопрос, но, надеюсь, вы увидите, что в Esri REST API теперь есть метод GenerateToken: resources.arcgis.com/en/help/arcgis-rest-api/index.html#//…
Натан Ву,
7

Пожалуйста, ознакомьтесь с тем, как работает ArcGIS Server Security.

По сути, вам нужно будет создавать пользователей и группы, а также предоставлять конкретному пользователю права на определенные сервисы.

Как только вы это сделаете, вам нужно будет использовать безопасность на основе токенов в вашем приложении JavaScript. Это означает, что вы запрашиваете у пользователя имя пользователя и пароль. Это отправляется на ArcGIS Server, который проверяет учетные данные и отправляет обратно токен. Этот токен используется для проверки пользователя всякий раз, когда запрашивается ресурс.

Вы, как программист, будете отправлять этот токен каждому картографическому сервису, сервису запросов и т. Д.

На этой странице подробно описано, как использовать сервисы на основе токенов .

ArcGIS Javascript API уже поставляется с классом, IdentityManager для этого.

Вот несколько примеров использования Identity Manager.

Девдатта Тенгше
источник
3

В ArcGIS API for JavaScript есть виджет, называемый Identity Manager, который точно соответствует тому, что вы хотите сделать. Посмотрите примеры, которые используют менеджер удостоверений, чтобы увидеть, как он работает.

Образец, связанный с Devdatta, хотя и является действительным, является способом Pre-Identity Manager, позволяющим сделать это, и включает в себя намного больше кода, необходимого сейчас, когда аутентификация для защищенных служб встроена в API.

Дерек Суингли
источник
1
Я только что взял образец ссылки для документации ESRI. Можно ли обновить документацию, указав новые образцы?
Девдатта Тенгше
2
Люди, спасибо за ваши подсказки, но я думаю, вы не поняли мою точку зрения. Сценарий таков: мой пользователь получит доступ к N защищенным картографическим сервисам, а это значит, что он будет обеспокоен N раз запросом входа в систему. Поскольку к картографическим сервисам ВСЕХ пользователей можно получить доступ с использованием одних и тех же учетных данных, я бы хотел, чтобы мое приложение запрашивало их ТОЛЬКО ОДИН РАЗ, а затем использовал их для автоматической аутентификации каждого картографического сервиса. На этом этапе я предполагаю, что мне следует использовать страницу прокси для обработки нескольких аутентификаций картсервиса с ArcGIS Server. Звучит хорошо? Есть более прямолинейная альтернатива? Заранее спасибо, надеюсь, я прояснил свои потребности ..
csparpa
2

Вы также можете использовать прокси, поэтому ваше приложение никогда не будет запрашивать имя пользователя и пароль. И вам не нужно устанавливать токен для доступа к защищенным сервисам, когда вы к ним обращаетесь. Единственное, что вам нужно сделать, это в вашем файле JS установить следующее: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (например, http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; и в своем файле proxy.config укажите все службы, которые вы используете в своем приложении.
См. https: //github.com/Esri/resource-proxy/ для получения более подробной информации о прокси- сервере.Так как вы хотите аутентификацию на основе токенов, в вашем файле proxy.config вам нужно добавить только URL, имя пользователя, пароль и содержимое matchAll.

Майур Патель
источник