Programowe uwierzytelnianie w zabezpieczonych warstwach ArcGIS Server za pośrednictwem RESTful API

16

Mam instancję ArcGIS 10.1 Server, która udostępnia bezpieczne usługi map w Internecie. Potrzebuję zakodować aplikację kliencką (którą aktualnie buduję przy użyciu interfejsu API ArcGIS Javascript w wersji 3.3), aby umożliwić użytkownikowi przeglądanie zabezpieczonych usług internetowych:

Myślę, że ten internetowy przykład ESRI to dobry początek.

Moja wola nie polega na pytaniu użytkownika o uwierzytelnienie KAŻDEJ usługi map, ponieważ już wiem, że WSZYSTKIE usługi map należą do niej / niego i dlatego są dla niej dostępne pod tą samą nazwą użytkownika i hasłem. W moim pomyśle monit o podanie poświadczeń powinien pojawić się tylko RAZ, a zatem kod JS powinien przekazywać poświadczenia do każdej usługi mapowania za pomocą pewnego rodzaju wywołania RESTful. Wydaje mi się, że interfejs API REST ArcGIS Server nie zapewnia takiego połączenia ... może się mylę.

Czy zatem ten „RESTful” sposób logowania do zabezpieczonych usług map jest możliwy dzięki ArcGIS Server (umożliwiając programowy dostęp do zabezpieczonych usług)? Jeśli tak, to czy ktoś z was może podać przykłady lub łącza do zasobów internetowych, które to wyjaśniają?

csparpa
źródło
Daj nam znać wersję ArcGIS GIS Server (10.0 LUB 10.1)?
Sunil
Sunil, zapomniałem go napisać, jest 10,1!
csparpa
1
korzystasz ze sklepu bezpieczeństwa Arcgis, a nie z Windows Auth?
Brad Nesom
@Brad Nesom w tej chwili moja instancja ArcGIS Server korzysta z wbudowanego sklepu bezpieczeństwa (z użytkownikami i rolami), ale planuję połączyć instancję z zewnętrznym serwerem LDAP w celu uwierzytelnienia
csparpa 30.01.2013

Odpowiedzi:

11

W końcu znalazłem to, czego szukałem: właściwy punkt końcowy sieci ArcGIS Server, którego mógłbym użyć do generowania tokenów!

Połączenie jest następujące:

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

który zwraca token do treści odpowiedzi HTTP i można wysłać go do każdego kolejnego żądania do zabezpieczonych zasobów bez ponownego monitowania o poświadczenia. Token musi być wartością Cookienagłówka żądania, ponieważ jest on obecnie przechowywany w pliku cookie po stronie klienta.

Ale ... cholera ! Ten generator tokenów NIE jest częścią API REST ArcGIS Server !!! Nie mogłem go znaleźć w dokumentacji online API ! Gdzie na świecie mogłem to znaleźć ???

Oznacza to, że ArcGIS Server nie ma struktury uwierzytelniania RESTful.

Na przykład, jeśli udostępniamy tę usługę mapowania w ramach interfejsu API ArcGIS REST: /arcgis/rest/services/myDir/myMapService/MapServer/layersi staramy się uzyskać ten zasób, to otrzymujemy z ArcGIS Server odpowiedź zawierającą 200: OKkod stanu i dokument HTML w treści (HTML to formularz logowania ). Po niedoszłym RESTful'u spodziewałbym się, że żądanie zwróciło mi 401: Authentication Requiredkod statusu wraz z WWW-Authenticatenagłówkiem ... Sam to przetestowałem za pomocą programu klienta REST.

csparpa
źródło
3
Niestety większość implementacji „RESTful” nie jest RESTful :) Kilka lat temu zrezygnowałem z tego, że jestem bardzo rygorystyczny, ponieważ prawda jest taka, że ​​większość implementacji jest „podobnych do REST”. W twoim konkretnym przypadku zastosowania zazwyczaj mam inne podejście. Korzystam z wbudowanego wybranego systemu uwierzytelniania i proxy żądań ArcGIS otwartych. Jeśli więc zajmowałem się uwierzytelnianiem za pomocą uwierzytelniania Django, Ruby, Netto itp., Korzystam z tego systemu. Następnie, gdy ten system powie, że jest OK, możesz przesłać żądania proxy do wewnętrznego serwera / portu ArcGIS, który jest zablokowany przed światem zewnętrznym.
Ragi Yaser Burhum
2
Cześć @Ragi Yaser Burhum, masz rację: nigdy nie będziemy żyć w świecie w pełni RESTful ;-) Zastanawiałem się również nad takim podejściem: Podoba mi się pomysł posiadania serwera proxy (który mógłby również obsługiwać żądania do usług internetowych innych niż ArcGIS Server , również)), ale potrzebuję utrzymać jak najmniej złożoność całej architektury. Po odkryciu, że istnieje prosty sposób na programowe uwierzytelnienie użytkowników w usłudze mapservice, przejdę to! W każdym razie dzięki!
csparpa
Może to zbyt stare pytanie, ale mam nadzieję, że można zobaczyć, że interfejs API REST Esri ma teraz metodę GenerateToken: resources.arcgis.com/en/help/arcgis-rest-api/index.html#//…
Nathan Wu
7

Zobacz, jak działa ArcGIS Server Security.

Zasadniczo będziesz musiał utworzyć użytkowników i grupy oraz dać określone prawa użytkownika do określonych usług.

Gdy to zrobisz, musisz użyć zabezpieczeń opartych na Tokenach w swojej aplikacji JavaScript. Oznacza to, że pytasz użytkownika o jego nazwę użytkownika i hasło. To jest wysyłane do ArcGIS Server, który sprawdza poświadczenia i odsyła token. Ten token służy do sprawdzania poprawności użytkownika za każdym razem, gdy żądany jest zasób.

Jako programista wyślesz ten token do każdej usługi mapowej, usługi zapytań itp.

Ta strona zawiera szczegółowe informacje na temat korzystania z usług opartych na tokenach .

ArcGIS Javascript API jest już wyposażony w klasę, IdentityManager, aby to zrobić.

Oto kilka przykładów korzystania z Menedżera tożsamości.

Devdatta Tengshe
źródło
3

W ArcGIS API for JavaScript znajduje się widget o nazwie Identity Manager, który odpowiada dokładnie temu, co chcesz zrobić. Sprawdź przykłady, które używają menedżera tożsamości, aby zobaczyć, jak to działa.

Próbka połączona przez Devdatta, mimo że jest poprawna, jest sposobem na to, aby zrobić to wcześniej i wymaga znacznie więcej kodu, który jest niezbędny teraz, gdy uwierzytelnianie dla bezpiecznych usług jest wprowadzone do API.

Derek Swingley
źródło
1
Właśnie pobrałem przykładowy link do dokumentacji ESRI. Czy można zaktualizować dokumentację, aby wskazywała nowe próbki?
Devdatta Tengshe,
2
Ludzie, dzięki za podpowiedzi, ale myślę, że nie zrozumieliście mojego punktu. Scenariusz jest taki: mój użytkownik będzie miał dostęp do N zabezpieczonych usług map, co oznacza, że ​​N będzie przeszkadzał N razy przy logowaniu. Ponieważ dostęp do WSZYSTKICH mapservices użytkowników jest możliwy przy użyciu tych samych poświadczeń, chciałbym, aby moja aplikacja poprosiła JUST ONCE o nie, a następnie użyła ich do automatycznego uwierzytelnienia każdej usługi map. Na tym etapie myślę, że powinienem użyć strony proxy do obsługi wielu uwierzytelnień mapservice za pomocą ArcGIS Server. Brzmi dobrze? Jakaś bardziej prosta alternatywa? Z góry dziękuję, mam nadzieję, że wyjaśniłem moje potrzeby.
csparpa
2

Możesz także użyć serwera proxy, aby Twoja aplikacja nigdy nie pytała o nazwę użytkownika i hasło. I nie musisz ustawiać tokena, aby uzyskiwał dostęp do zabezpieczonych usług za każdym razem, gdy uzyskujesz do nich dostęp. Jedyne, co musisz zrobić, to w pliku JS ustawić następujące ustawienia: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (np. http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; w pliku proxy.config zapewnij wszystkie usługi, z których korzystasz w aplikacji.
Zobacz https: //github.com/Esri/resource-proxy/, aby uzyskać więcej informacji na temat serwera proxy.Aby uzyskać uwierzytelnianie oparte na tokenach, w pliku proxy.config należy dodać adres URL, nazwę użytkownika, hasło i dopasowanie Tylko cała treść.

Mayur Patel
źródło