Authentification par programmation sur les couches sécurisées d'ArcGIS Server via l'API RESTful

16

J'ai une instance d'ArcGIS 10.1 Server exposant des services de carte sécurisés sur Internet. Mon besoin est de coder une application client (que je suis en train de construire en utilisant la version 3.3 de l'API ArcGIS Javascript) permettant à l'utilisateur de visualiser ces services web sécurisés:

Je pense que cet exemple ESRI en ligne est un bon début.

Ma volonté est de ne pas inviter l'utilisateur à CHAQUE authentification mapservice car je sais déjà que TOUS les services map appartiennent à lui / elle et sont donc accessibles par lui / elle sous le même nom d'utilisateur et mot de passe. Dans mon idée, l'invite pour les informations d'identification devrait apparaître juste UNE FOIS et donc le code JS devrait fournir des informations d'identification à chacun des services de carte via une sorte d'appel de connexion RESTful. Pour moi, il ne semble pas que l'API REST d'ArcGIS Server fournisse un tel appel ... je me trompe peut-être.

Cette façon "RESTful" de se connecter à des services de carte sécurisés est-elle donc possible avec ArcGIS Server (permettant d'accéder par programmation aux services sécurisés)? Si oui, pouvez-vous fournir des exemples ou des liens vers des ressources Web expliquant cela?

csparpa
la source
Veuillez nous indiquer la version d'ArcGIS GIS Server (10.0 OU 10.1) ??
Sunil
Sunil, j'ai oublié de l'écrire, c'est 10.1!
csparpa
1
utilisez-vous ArcGis Security Store et non Windows Auth?
Brad Nesom
@Brad Nesom pour le moment, mon instance ArcGIS Server utilise un magasin de sécurité intégré (avec utilisateurs et rôles), mais je
prévois

Réponses:

11

J'ai finalement trouvé ce que je cherchais: un point de terminaison Web ArcGIS Server approprié que je pouvais utiliser pour générer des jetons!

L'appel est le suivant:

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

ce qui rend le jeton dans le corps de réponse HTTP, et on peut l'envoyer à toute autre demande de ressources sécurisées sans être invité à nouveau pour les informations d'identification. Le jeton doit être la valeur de l'en- Cookietête de la demande, car il est actuellement stocké dans un cookie côté client.

Mais ... putain ! Ce générateur de jetons NE fait PAS partie de l'API REST d'ArcGIS Server !!! Je ne l'ai pas trouvé dans la documentation API en ligne ! Où dans le monde pourrais-je le trouver ???

Cela signifie qu'ArcGIS Server n'a pas de cadre d'authentification RESTful.

Par exemple, si nous avons ce service de carte exposé sous l'API ArcGIS REST: /arcgis/rest/services/myDir/myMapService/MapServer/layerset que nous essayons d'obtenir cette ressource, ce que nous obtenons d'ArcGIS Server est une réponse ayant un 200: OKcode d'état et un document HTML dans le corps (le HTML est un formulaire de connexion ). À partir d'une connexion potentielle RESTful, je m'attendrais à ce que la demande me redonne un 401: Authentication Requiredcode d'état avec un en- WWW-Authenticatetête ... J'ai testé tout cela moi-même en utilisant un programme client REST.

csparpa
la source
3
Malheureusement, la plupart des implémentations "RESTful" ne sont pas RESTful :) Il y a quelques années, j'ai renoncé à être très strict à ce sujet car la vérité est que la plupart des implémentations sont "REST-like". Pour votre cas d'utilisation particulier, j'adopte généralement une approche différente. J'utilise le système d'authentification intégré de choix et les requêtes ArcGIS ouvertes par proxy. Donc, si je gérais l'authentification avec l'authentification Django, ou Ruby, ou .net ou autre, j'utilise ce système. Ensuite, lorsque ce système indique qu'il est OK, vous pouvez envoyer des requêtes par proxy à un serveur / port ArcGIS interne verrouillé du monde extérieur.
Ragi Yaser Burhum
2
Bonjour @Ragi Yaser Burhum, vous avez raison: nous ne vivrons jamais dans un monde pleinement RESTful ;-) J'ai également envisagé une approche comme la vôtre: j'aime l'idée d'avoir un proxy (qui pourrait également gérer les demandes de services Web autres qu'ArcGIS Server) , aussi), mais je suis dans le besoin de maintenir la complexité de l'ensemble de l'architecture aussi faible que possible. Donc, après avoir découvert qu'il existe un moyen simple d'authentifier par programmation les utilisateurs auprès de mapservices, je vais y aller! Merci quand même!
csparpa
C'est peut-être une question trop ancienne, mais j'espère que vous pourrez voir que l'API REST Esri a désormais la méthode GenerateToken: resources.arcgis.com/en/help/arcgis-rest-api/index.html#//…
Nathan Wu
7

Veuillez consulter le fonctionnement d' ArcGIS Server Security.

Fondamentalement, vous devrez créer des utilisateurs et des groupes, et accorder des droits d'utilisateur particuliers sur certains services.

Une fois que vous avez fait cela, vous devez utiliser la sécurité basée sur les jetons dans votre application JavaScript. Cela signifie que vous demandez à l'utilisateur son nom d'utilisateur et son mot de passe. Celui-ci est envoyé à ArcGIS Server, qui valide les informations d'identification et renvoie un jeton. Ce jeton est utilisé pour valider l'utilisateur chaque fois qu'une ressource est demandée.

En tant que programmeur, vous enverrez ce jeton à chaque service de carte, service de requête, etc.

Cette page détaille comment utiliser les services basés sur les jetons .

L'API Javascript ArcGIS est déjà livrée avec une classe, l' IdentityManager pour ce faire.

Voici quelques exemples d'utilisation de Identity Manager.

Devdatta Tengshe
la source
3

Dans l'API ArcGIS pour JavaScript, il existe un widget appelé Identity Manager qui traite exactement ce que vous voulez faire. Découvrez des exemples qui utilisent le gestionnaire d'identité pour voir comment cela fonctionne.

L'exemple lié par Devdatta, bien que valide, est le moyen de le faire avant Identity Manager et implique beaucoup plus de code qui est nécessaire maintenant que l'authentification pour les services sécurisés est intégrée dans l'API.

Derek Swingley
la source
1
Je venais de prendre l'exemple de lien pour la documentation d'ESRI. La documentation peut-elle être mise à jour pour pointer vers les nouveaux échantillons?
Devdatta Tengshe
2
Mes amis, merci pour vos conseils, mais je pense que vous n'avez pas compris mon point. Le scénario est le suivant: mon utilisateur va accéder à N services de carte sécurisés, ce qui signifie qu'il va être dérangé N fois avec une invite de connexion. Étant donné que TOUS les services de carte de l'utilisateur sont accessibles en utilisant les mêmes informations d'identification, j'aimerais que mon application les demande JUSTE UNE FOIS, puis les utilise pour authentifier automatiquement chaque service de carte. À ce stade, je suppose que je devrais utiliser une page proxy pour gérer plusieurs authentifications mapservice avec ArcGIS Server. Ça m'a l'air bien? Une alternative plus simple? Merci d'avance, j'espère avoir clarifié mes besoins ..
csparpa
2

Vous pouvez également utiliser le proxy, de sorte que votre application ne vous demandera jamais de nom d'utilisateur et de mot de passe. Et vous n'avez pas besoin de configurer Token pour accéder aux services sécurisés chaque fois que vous y accédez. La seule chose que vous devez faire est dans votre fichier JS, définissez ce qui suit: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (par exemple, http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; et dans votre fichier proxy.config, fournissez tous les services que vous consommez dans votre application.
Consultez https: //github.com/Esri/resource-proxy/ pour plus de détails sur le proxy. Comme vous voulez une authentification basée sur des jetons, dans votre fichier proxy.config, vous devez ajouter uniquement l'url, le nom d'utilisateur, le mot de passe et le contenu matchAll.

Mayur Patel
la source