Programmatische Authentifizierung bei ArcGIS Server-gesicherten Layern über die RESTful-API

16

Ich habe eine ArcGIS 10.1 Server-Instanz, die gesicherte Kartendienste im Internet verfügbar macht. Ich muss eine Client-Anwendung (die ich derzeit mit der Version 3.3 der ArcGIS-JavaScript-API erstelle) codieren, damit der Benutzer diese gesicherten Webservices anzeigen kann:

Ich denke, dieses Online-ESRI-Beispiel ist ein guter Anfang.

Mein Wille ist es, den Benutzer nicht nach JEDER Karten-Authentifizierung fragen zu lassen, da ich bereits weiß, dass ALLE Karten-Services zu ihm gehören und daher für ihn unter demselben Benutzernamen und Passwort zugänglich sind. In meiner Vorstellung sollte die Aufforderung zur Eingabe von Anmeldeinformationen nur EINMAL erscheinen, und daher sollte der JS-Code die Anmeldeinformationen über einen REST-fähigen Anmeldeaufruf an jeden der Kartendienste weiterleiten. Mir scheint es nicht, dass die ArcGIS Server REST-API einen solchen Aufruf bereitstellt ... vielleicht irre ich mich.

Ist diese "REST-konforme" Methode zum Anmelden bei gesicherten Kartenservices mit ArcGIS Server möglich (um programmgesteuert auf gesicherte Services zugreifen zu können)? Wenn ja, kann jemand von Ihnen Beispiele oder Links zu Webressourcen bereitstellen, die dies erklären?

csparpa
quelle
Teilen Sie uns bitte die ArcGIS GIS Server-Version (10.0 ODER 10.1) mit.
So.,
Sunil, ich habe vergessen es zu schreiben, es ist 10.1!
Csparpa
1
Verwenden Sie ArcGIS Security Store und nicht Windows Auth?
Brad Nesom
@Brad Nesom für den Moment meiner ArcGIS Server - Instanz wird mit einem integrierten Sicherheitsspeicher (mit Benutzern und Rollen), aber ich habe vor , um die Instanz zu einem externen LDAP - Server zur Authentifizierung zu verknüpfen
csparpa

Antworten:

11

Endlich habe ich gefunden, wonach ich gesucht habe: Einen richtigen ArcGIS Server-Web-Endpunkt, mit dem ich Token generieren kann!

Der Aufruf lautet:

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

Dadurch wird das Token an den HTTP-Antworttext zurückgegeben, und es kann an gesicherte Ressourcen gesendet werden, ohne dass erneut Anmeldeinformationen abgefragt werden müssen. Das Token muss der Wert für den CookieAnforderungsheader sein, da es derzeit auf der Clientseite in einem Cookie gespeichert ist.

Aber ... verdammt ! Dieser Token-Generator ist NICHT Bestandteil der ArcGIS Server REST-API !!! Ich konnte es in der Online-API-Dokumentation nicht finden ! Wo auf der Welt konnte ich es finden ???

Dies bedeutet, dass ArcGIS Server kein RESTful-Authentifizierungsframework hat.

Wenn wir diesen Karten-Service beispielsweise unter der ArcGIS REST-API verfügbar machen /arcgis/rest/services/myDir/myMapService/MapServer/layersund versuchen, diese Ressource abzurufen , erhalten wir von ArcGIS Server eine Antwort mit einem 200: OKStatuscode und einem HTML-Dokument im Hauptteil (das HTML ist ein Anmeldeformular) ). Bei einem REST -fähigen Login würde ich erwarten, dass die Anfrage mir einen 401: Authentication RequiredStatuscode und einen WWW-AuthenticateHeader zurückgibt ... Ich habe das Ganze selbst mit einem REST-Client-Programm getestet.

csparpa
quelle
3
Leider sind die meisten "RESTful" -Implementierungen nicht RESTful :) Vor einigen Jahren gab ich es auf, diesbezüglich sehr streng zu sein, weil die Wahrheit ist, dass die meisten Implementierungen "REST-like" sind. Für Ihren speziellen Anwendungsfall verfolge ich normalerweise einen anderen Ansatz. Ich verwende das integrierte Authentifizierungssystem meiner Wahl und öffne Proxy-Anfragen für ArcGIS. Wenn ich die Authentifizierung mit Django-Authentifizierung, Ruby oder .net oder was auch immer handhabte, verwende ich dieses System. Wenn dieses System dies als OK einstuft, können Sie die Anforderungen an einen internen ArcGIS-Server / -Port weiterleiten, der für die Außenwelt gesperrt ist.
Ragi Yaser Burhum
2
Hallo @Ragi Yaser Burhum, Sie haben Recht: Wir werden niemals in einer vollständig REST-fähigen Welt leben ;-) Ich habe auch einen Ansatz wie Ihren in Betracht gezogen: Ich mag die Idee, einen Proxy zu haben (der auch Anforderungen an andere Webservices als ArcGIS Server verarbeiten kann Ich bin jedoch bemüht, die Komplexität der gesamten Architektur so gering wie möglich zu halten. Nachdem ich herausgefunden habe, dass es eine direkte Möglichkeit gibt, Benutzer programmgesteuert für Kartendienste zu authentifizieren, gehe ich folgendermaßen vor! Danke trotzdem!
csparpa
Vielleicht ist dies eine zu alte Frage, aber Sie können hoffentlich sehen, dass die Esri REST-API jetzt die GenerateToken-Methode hat: resources.arcgis.com/en/help/arcgis-rest-api/index.html#//…
Nathan Wu
7

Schauen Sie sich an, wie ArcGIS Server Security funktioniert.

Grundsätzlich müssen Sie Benutzer und Gruppen einrichten und einem bestimmten Benutzer Rechte für bestimmte Dienste erteilen.

Sobald Sie dies getan haben, müssen Sie die auf Token basierende Sicherheit in Ihrer JavaScript-Anwendung verwenden. Dies bedeutet, dass Sie den Benutzer nach seinem Benutzernamen und Kennwort fragen. Dies wird an den ArcGIS-Server gesendet, der die Anmeldeinformationen überprüft und ein Token zurücksendet. Dieses Token wird verwendet, um den Benutzer zu validieren, wenn eine Ressource angefordert wird.

Sie als Programmierer senden dieses Token an jeden Kartendienst, Abfragedienst usw.

Auf dieser Seite erfahren Sie, wie Sie Token Based Services verwenden .

Die ArcGIS-JavaScript-API enthält bereits eine Klasse, den IdentityManager , um dies zu tun.

Im Folgenden finden Sie einige Beispiele zur Verwendung des Identity Managers.

Devdatta Tengshe
quelle
3

In der ArcGIS-API für JavaScript gibt es ein Widget mit dem Namen Identity Manager , das genau das angibt, was Sie tun möchten. Sehen Sie sich Beispiele an, die den Identitätsmanager verwenden, um zu sehen, wie es funktioniert.

Das von Devdatta verknüpfte Beispiel ist zwar gültig, stellt jedoch die Möglichkeit vor Identity Manager dar und umfasst viel mehr Code, der jetzt erforderlich ist, da die Authentifizierung für sichere Dienste in die API integriert wird.

Derek Swingley
quelle
1
Ich hatte gerade den Beispiellink für die Dokumentation von ESRI genommen. Kann die Dokumentation aktualisiert werden, um auf die neuen Beispiele zu verweisen?
Devdatta Tengshe
2
Leute, danke für deine Hinweise, aber ich glaube, du hast meinen Standpunkt nicht verstanden. Das Szenario ist: Mein Benutzer wird auf N gesicherte Kartenservices zugreifen, was bedeutet, dass er N-mal mit einer Anmeldeaufforderung belästigt wird. Da auf ALLE Kartendienste von Benutzern mit denselben Anmeldeinformationen zugegriffen werden kann, möchte ich, dass meine App JUST ONCE nach ihnen fragt und sie dann verwendet, um jeden Kartendienst automatisch zu authentifizieren. In diesem Stadium sollte ich eine Proxy- Seite verwenden, um mehrere Karten-Service-Authentifizierungen mit ArcGIS Server durchzuführen. Hört sich gut an? Noch eine geradlinigere Alternative? Vielen Dank im Voraus, hoffe, ich habe meine Bedürfnisse klar gemacht ..
csparpa
2

Sie können auch Proxy verwenden, sodass Ihre Anwendung niemals zur Eingabe von Benutzername und Kennwort auffordert. Und Sie müssen Token nicht so einstellen, dass Sie immer auf gesicherte Dienste zugreifen, wenn Sie darauf zugreifen. Sie müssen lediglich in Ihrer JS-Datei Folgendes festlegen: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (z. B. http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; und stellen Sie in Ihrer proxy.config-Datei alle Dienste bereit, die Sie in Ihrer Anwendung verbrauchen.
Siehe https: //github.com/Esri/resource-proxy/ für weitere Informationen zum Proxy. Wenn Sie eine tokenbasierte Authentifizierung wünschen, müssen Sie in Ihrer proxy.config-Datei nur URL, Benutzername, Kennwort und matchAll-Inhalt hinzufügen.

Mayur Patel
quelle