Autenticazione programmatica su livelli protetti di ArcGIS Server tramite API RESTful


16

Ho un'istanza di ArcGIS 10.1 Server che espone i servizi di mappe protetti su Internet. La mia necessità è quella di codificare un'applicazione client (che sto attualmente creando utilizzando la versione 3.3 dell'API Javascript ArcGIS) che consenta all'utente di visualizzare quei servizi Web sicuri:

Penso che questo esempio ESRI online sia un buon inizio.

La mia volontà non è quella di richiedere all'utente l'autenticazione PER OGNI autenticazione di Mapservice perché so già che TUTTI i Mapservice appartengono a lui / lui e quindi sono accessibili da lui / lui con lo stesso nome utente e password. Nella mia idea, il prompt per le credenziali dovrebbe apparire solo UNA VOLTA e quindi il codice JS dovrebbe alimentare le credenziali a ciascuno dei servizi di mappe tramite una sorta di chiamata di accesso RESTful. Per me non sembra che l'API REST di ArcGIS Server stia fornendo tale chiamata ... forse mi sbaglio.

È quindi possibile questo modo "RESTful" di accedere a servizi di mappe sicuri con ArcGIS Server (rendendo possibile l'accesso a servizi protetti a livello di codice)? In tal caso, qualcuno di voi può fornire esempi o collegamenti a risorse Web che spiegano questo?


Fateci sapere la versione ArcGIS GIS Server (10.0 o 10.1) ??
Sunil,

Sunil, ho dimenticato di scriverlo, sono le 10.1!
csparpa,

1
stai usando arcgis security store e non windows auth?
Brad Nesom,

@Brad Nesom per il momento la mia istanza di ArcGIS Server sta usando un archivio di sicurezza integrato (con utenti e ruoli), ma sto pianificando di collegare l'istanza a un server LDAP esterno per scopi di autenticazione
csparpa

Risposte:


11

Alla fine ho trovato quello che cercavo: un endpoint Web ArcGIS Server adatto che potevo usare per generare token!

La chiamata è questa:

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

che restituisce il token nel corpo della risposta HTTP e si può inviarlo a qualsiasi ulteriore richiesta a risorse protette senza che vengano richieste nuovamente le credenziali. Il token deve essere il valore per l' Cookieintestazione della richiesta, poiché è attualmente memorizzato in un cookie sul lato client.

Ma ... accidenti ! Questo generatore di token NON fa parte dell'API REST di ArcGIS Server !!! Non sono riuscito a trovarlo nella documentazione dell'API online ! In quale parte del mondo ho potuto trovarlo ???

Ciò significa che ArcGIS Server non ha un framework di autenticazione RESTful.

Ad esempio, se questo servizio di mappe è esposto sotto l'API REST di ArcGIS: /arcgis/rest/services/myDir/myMapService/MapServer/layerse proviamo a OTTENERE questa risorsa, ciò che otteniamo da ArcGIS Server è una risposta con un 200: OKcodice di stato e un documento HTML nel corpo (l'HTML è un modulo di accesso ). Da un possibile accesso RESTful, mi aspetto che la richiesta mi abbia restituito un 401: Authentication Requiredcodice di stato insieme a WWW-Authenticateun'intestazione ... Ho testato il tutto da solo usando un programma client REST.


3
Purtroppo la maggior parte delle implementazioni "RESTful" non sono RESTful :) Alcuni anni fa ho rinunciato a essere super-severo su questo perché la verità è che la maggior parte delle implementazioni sono "REST-like". Per il tuo particolare caso d'uso, di solito adotto un approccio diverso. Uso il sistema di autenticazione incorporato preferito e proxy le richieste aperte di ArcGIS. Quindi se stavo gestendo l'autenticazione con l'autenticazione Django, ruby, .net o altro, uso quel sistema. Quindi, quando quel sistema dice che è OK, puoi inoltrare le richieste a un server / porta ArcGIS interno che è bloccato dal mondo esterno.
Ragi Yaser Burhum,

2
Ciao @Ragi Yaser Burhum, hai ragione: non vivremo mai in un mondo completamente RESTful ;-) Ho anche considerato un approccio come il tuo: mi piace l'idea di avere un proxy (che potrebbe anche gestire le richieste di servizi web diversi da ArcGIS Server , anche) ma ho bisogno di mantenere la complessità dell'intera architettura il più bassa possibile. Quindi, dopo aver scoperto che esiste un modo semplice per autenticare a livello di codice gli utenti su mapservices, lo percorrerò! Grazie comunque!
csparpa,

Forse questa è una domanda troppo vecchia, ma spero che tu possa vedere l'API REST di Esri ora avere il metodo GenerateToken: resources.arcgis.com/en/help/arcgis-rest-api/index.html#//…
Nathan Wu

7

Dai un'occhiata a come funziona ArcGIS Server Security.

Fondamentalmente, dovrai creare utenti e gruppi e assegnare a un utente determinati diritti su determinati servizi.

Una volta fatto ciò, è necessario utilizzare la sicurezza basata su token nell'applicazione JavaScript. Ciò significa che chiedi all'utente il nome utente e la password. Viene inviato al server ArcGIS, che convalida le credenziali e restituisce un token. Questo token viene utilizzato per convalidare l'utente ogni volta che viene richiesta una risorsa.

Come programmatore, invierai questo token a ogni servizio di mappe, servizio di query ecc.

Questa pagina spiega come utilizzare i servizi basati su token .

L'API Javascript ArcGIS viene già fornita con una Classe, IdentityManager per farlo.

Ecco un paio di esempi su come utilizzare Identity Manager.


3

Nell'API ArcGIS per JavaScript, c'è un widget chiamato Identity Manager che si rivolge esattamente a ciò che si desidera fare. Dai un'occhiata agli esempi che utilizzano il gestore delle identità per vedere come funziona.

L'esempio collegato da Devdatta, sebbene valido, è il modo pre-Identity Manager per farlo e coinvolge molto più codice necessario ora che l'autenticazione per i servizi sicuri è inserita nell'API.


1
Avevo appena preso il link di esempio per la documentazione di ESRI. La documentazione può essere aggiornata per indicare i nuovi campioni?
Devdatta Tengshe

2
Gente, grazie per i vostri suggerimenti, ma penso che non abbiate capito il mio punto. Lo scenario è: il mio utente accederà a N mapservices sicuri, il che significa che verrà infastidito N volte con un prompt di login. Poiché è possibile accedere a TUTTI i servizi di mappe dell'utente utilizzando le stesse credenziali, vorrei che la mia app chiedesse SOLO UNA VOLTA per loro e quindi li usassi per autenticare automaticamente ogni servizio di mappe. A questo punto, suppongo che dovrei usare una pagina proxy per gestire più auth di mapservice con ArcGIS Server. Suona bene? Qualche alternativa più onesta? Grazie in anticipo, spero di aver chiarito le mie esigenze ..
csparpa,

2

Puoi anche usare Proxy, quindi la tua applicazione non richiederà mai UserName e Password. E non è necessario impostare token per accedere ai servizi protetti ogni volta che si accede a questi. L'unica cosa che devi fare è nel tuo file JS, imposta quanto segue: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (es. http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; E nel tuo file proxy.config, fornisci tutti i servizi che stai consumando nella tua applicazione.
Fai riferimento a https: //github.com/Esri/resource-proxy/ per ulteriori dettagli sul proxy. Se si desidera l'autenticazione basata su token, nel file proxy.config, è necessario aggiungere solo URL, nome utente, password e matchTutti i contenuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.