Autenticación programática para capas seguras de ArcGIS Server a través de RESTful API

16

Tengo una instancia de ArcGIS 10.1 Server que expone servicios de mapas seguros en Internet. Mi necesidad es codificar una aplicación cliente (que actualmente estoy construyendo usando la versión 3.3 de la API de JavaScript de ArcGIS) que permite al usuario ver esos servicios web seguros:

Creo que este ejemplo de ESRI en línea es un buen comienzo.

Mi voluntad es que no se solicite al usuario CADA autenticación de servicio de mapas porque ya sé que TODOS los servicios de mapas pertenecen a él / ella y, por lo tanto, son accesibles para él / ella con el mismo nombre de usuario y contraseña. En mi idea, la solicitud de credenciales debería aparecer SOLO UNA VEZ y, por lo tanto, el código JS debería alimentar las credenciales a cada uno de los servicios de mapas a través de algún tipo de llamada de inicio de sesión RESTful. Para mí, no parece que la API REST de ArcGIS Server esté proporcionando esa llamada ... tal vez estoy equivocado.

¿Es por lo tanto esta forma "RESTful" de iniciar sesión en servicios de mapas seguros factible con ArcGIS Server (haciendo posible acceder a servicios seguros mediante programación)? Si es así, ¿alguno de ustedes puede proporcionar ejemplos o enlaces a recursos web que expliquen esto?

csparpa
fuente
Por favor, háganos saber la versión del servidor ArcGIS GIS (10.0 o 10.1) ??
Sunil
Sunil, olvidé escribirlo, ¡es 10.1!
csparpa
1
¿Está utilizando arcgis security store y no Windows Auth?
Brad Nesom el
@Brad Nesom por el momento mi instancia de ArcGIS Server está utilizando un almacén de seguridad incorporado (con usuarios y roles), pero estoy planeando vincular la instancia a un servidor LDAP externo para fines de autenticación
csparpa

Respuestas:

11

Finalmente encontré lo que estaba buscando: un punto final web de ArcGIS Server adecuado que pudiera usar para generar tokens.

La llamada es esta:

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

que devuelve el token al cuerpo de respuesta HTTP, y uno puede enviarlo a cualquier solicitud adicional a recursos seguros sin que se le soliciten nuevamente las credenciales. El token debe ser el valor para el Cookieencabezado de la solicitud, ya que actualmente está almacenado en una cookie en el lado del cliente.

Pero ... maldición ! ¡Este generador de tokens NO forma parte de la API REST de ArcGIS Server! ¡No pude encontrarlo en la documentación de la API en línea ! ¿Dónde en el mundo podría encontrarlo?

Esto significa que ArcGIS Server no tiene un marco de autenticación RESTful.

Por ejemplo, si tenemos este servicio de mapas expuesto bajo la API REST de ArcGIS: /arcgis/rest/services/myDir/myMapService/MapServer/layerse intentamos OBTENER este recurso, lo que obtenemos de ArcGIS Server es una respuesta que tiene un 200: OKcódigo de estado y un documento HTML en el cuerpo (el HTML es un formulario de inicio de sesión ) Desde un posible inicio de sesión RESTful, esperaría que la solicitud me devolviera un 401: Authentication Requiredcódigo de estado junto con un WWW-Authenticateencabezado ... Probé todo esto yo mismo usando un programa cliente REST.

csparpa
fuente
3
Lamentablemente, la mayoría de las implementaciones "RESTful" no son RESTful :) Hace algunos años dejé de ser muy estricto con esto porque la verdad es que la mayoría de las implementaciones son "RESTful". Para su caso de uso particular, generalmente adopto un enfoque diferente. Utilizo el sistema de autenticación incorporado de elección y proxy abre las solicitudes de ArcGIS. Entonces, si estaba manejando la autenticación con autenticación de Django, o ruby, o .net o lo que sea, uso ese sistema. Luego, cuando ese sistema dice que está bien, puede enviar las solicitudes a un servidor / puerto ArcGIS interno que está bloqueado en el mundo exterior.
Ragi Yaser Burhum
2
Hola @Ragi Yaser Burhum, tienes razón: nunca viviremos en un mundo completamente RESTful ;-) También consideré un enfoque como el tuyo: me gusta la idea de tener un proxy (que también podría manejar solicitudes a servicios web que no sean ArcGIS Server , también), pero necesito mantener la complejidad de toda la arquitectura lo más baja posible. Entonces, después de descubrir que hay una forma directa de autenticar mediante programación a los usuarios en los servicios de mapas, ¡lo guiaré! ¡Gracias de cualquier manera!
csparpa
Tal vez esta es una pregunta demasiado antigua, pero espero que pueda ver que la API REST de Esri ahora tiene el método GenerateToken: resources.arcgis.com/en/help/arcgis-rest-api/index.html#//…
Nathan Wu
7

Observe cómo funciona ArcGIS Server Security.

Básicamente, deberá crear usuarios y grupos, y otorgar derechos de usuario particulares sobre ciertos servicios.

Una vez que haya hecho eso, debe usar la seguridad basada en tokens en su aplicación de JavaScript. Lo que esto significa es que le pide al usuario su nombre de usuario y contraseña. Eso se envía al servidor ArcGIS, que valida las credenciales y devuelve un token. Este token se usa para validar al usuario cada vez que se solicita un recurso.

Usted, como programador, enviará este token a cada servicio de mapas, servicio de consultas, etc.

Esta página detalla cómo usar los servicios basados ​​en tokens .

ArcGIS Javascript API ya viene con una clase, el IdentityManager para hacer esto.

Aquí hay un par de ejemplos sobre cómo usar Identity Manager.

Devdatta Tengshe
fuente
3

En la API de ArcGIS para JavaScript, hay un widget llamado Identity Manager que aborda exactamente lo que desea hacer. Echa un vistazo a las muestras que usan el administrador de identidad para ver cómo funciona.

La muestra vinculada por Devdatta, si bien es válida, es la forma previa a Identity Manager de hacer esto e involucra mucho más código que es necesario ahora que la autenticación para servicios seguros está integrada en la API.

Derek Swingley
fuente
1
Acababa de tomar el enlace de muestra para la documentación de ESRI. ¿Se puede actualizar la documentación para apuntar a las nuevas muestras?
Devdatta Tengshe
2
Amigos, gracias por sus sugerencias, pero creo que no entendieron mi punto. El escenario es: mi usuario va a acceder a N servicios de mapas seguros, lo que significa que se molestará N veces con una solicitud de inicio de sesión. Debido a que se puede acceder a TODOS los servicios de mapas del usuario utilizando las mismas credenciales, me gustaría que mi aplicación los solicite SOLO UNA VEZ y luego los use para autenticar automáticamente cada servicio de mapas. En esta etapa, supongo que debería usar una página proxy para manejar la autenticación de múltiples servicios de mapas con ArcGIS Server. ¿Suena bien? ¿Alguna alternativa más directa? Gracias de antemano, espero haber aclarado mis necesidades ..
csparpa
2

También puede usar Proxy, por lo que su aplicación nunca solicitará Nombre de usuario y Contraseña. Y no necesita configurar Token para acceder a servicios seguros siempre que acceda a ellos. Lo único que debe hacer es en su archivo JS, configure lo siguiente: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (por ejemplo, http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; y en su archivo proxy.config, proporcione todos los servicios que está consumiendo en su aplicación.
Consulte https: //github.com/Esri/resource-proxy/ para obtener más detalles sobre el proxy. Como desea la autenticación basada en token, en su archivo proxy.config, debe agregar url, nombre de usuario, contraseña y solo coincidir con todo el contenido.

Mayur Patel
fuente