Autenticação programática para camadas protegidas do ArcGIS Server via API RESTful

16

Eu tenho uma instância do ArcGIS 10.1 Server expondo serviços de mapas seguros na Internet. Minha necessidade é codificar um aplicativo cliente (que estou construindo atualmente usando a versão 3.3 da API Javascript do ArcGIS), permitindo que o usuário visualize os serviços da web protegidos:

Penso que este exemplo online de ESRI é um bom começo.

Minha vontade é não solicitar ao usuário CADA autenticação de serviço de mapas, porque eu já sei que TODOS os serviços de mapas pertencem a ele e, portanto, são acessíveis por ele com o mesmo nome de usuário e senha. Na minha ideia, o prompt de credenciais deve aparecer apenas UMA VEZ e, portanto, o código JS deve alimentar as credenciais para cada serviço de mapas por meio de algum tipo de chamada de login RESTful. Para mim, não parece que a API REST do ArcGIS Server esteja fornecendo essa chamada ... talvez eu esteja errado.

Portanto, essa maneira "RESTful" de efetuar login em serviços de mapas protegidos é viável com o ArcGIS Server (possibilitando acessar serviços protegidos programaticamente)? Em caso afirmativo, algum de vocês pode fornecer exemplos ou links para recursos da Web que explicam isso?

csparpa
fonte
Por favor, deixe-nos saber a versão do ArcGIS GIS Server (10.0 OU 10.1) ??
Sunil 29/01
Sunil, esqueci de escrever, é 10.1!
Csparpa
1
você está usando o arcgis security store e não o windows auth?
precisa saber é o seguinte
@ Brad Nesom para o momento em que minha instância ArcGIS Server está usando uma loja de segurança built-in (com usuários e funções), mas eu estou planejando para ligar a instância a um servidor LDAP externo para fins de autenticação
csparpa

Respostas:

11

Finalmente encontrei o que estava procurando: um ponto de extremidade Web do ArcGIS Server adequado que eu pudesse usar para gerar tokens!

A chamada é esta:

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

que devolve o token ao corpo da resposta HTTP e pode-se enviá-lo para qualquer solicitação adicional a recursos protegidos sem que sejam solicitadas credenciais novamente. O token deve ser o valor do Cookiecabeçalho da solicitação, pois atualmente está armazenado em um cookie no lado do cliente.

Mas ... caramba ! Este gerador de token NÃO faz parte da API REST do ArcGIS Server !!! Não consegui encontrá-lo na documentação da API online ! Onde no mundo eu poderia encontrar isso ???

Isso significa que o ArcGIS Server não possui uma estrutura de autenticação RESTful.

Por exemplo, se tivermos este serviço de mapas exposto na API REST do ArcGIS: /arcgis/rest/services/myDir/myMapService/MapServer/layerse tentarmos obter esse recurso, o que obtemos do ArcGIS Server é uma resposta com um 200: OKcódigo de status e um documento HTML no corpo (o HTML é um formulário de login ) Em um login que seria RESTful, eu esperaria que a solicitação me devolvesse um 401: Authentication Requiredcódigo de status junto com um WWW-Authenticatecabeçalho ... Eu testei tudo isso usando um programa cliente REST.

csparpa
fonte
3
Infelizmente, a maioria das implementações "RESTful" não é RESTful :) Há alguns anos, desisti de ser super rigorosa com isso, porque a verdade é que a maioria das implementações é "semelhante a REST". Para o seu caso de uso específico, geralmente adoto uma abordagem diferente. Eu uso o sistema de autenticação interno de escolha e solicitações de proxy abertas do ArcGIS. Portanto, se eu estava lidando com autenticação com autenticação Django, ou ruby, ou .net ou o que quer que seja, eu uso esse sistema. Então, quando esse sistema diz que está tudo bem, você pode fazer proxy das solicitações para um servidor / porta interno do ArcGIS bloqueado para o mundo externo.
Ragi Yaser Burhum
2
Olá, @Ragi Yaser Burhum, você está certo: nunca viveremos em um mundo totalmente RESTful ;-) Também considerei uma abordagem como a sua: gosto da ideia de ter um proxy (que também pode lidar com solicitações de serviços da Web que não sejam o ArcGIS Server , também), mas preciso manter a complexidade de toda a arquitetura o mais baixa possível. Então, depois de descobrir que existe uma maneira direta de autenticar programaticamente os usuários nos serviços de mapas, eu irei lá! Obrigado mesmo assim!
Csparpa 31/01
Talvez essa seja uma pergunta muito antiga, mas espero que você possa ver a API REST Esri agora com o método GenerateToken: resources.arcgis.com/en/help/arcgis-rest-api/index.html#//…
Nathan Wu
7

Veja como o ArcGIS Server Security funciona.

Basicamente, você precisará criar usuários e grupos e conceder direitos a um usuário específico sobre determinados serviços.

Depois de fazer isso, você precisará usar a segurança baseada em token em seu aplicativo JavaScript. O que isso significa é que você solicita ao usuário o nome de usuário e a senha. Isso é enviado para o ArcGIS Server, que valida as credenciais e envia de volta um token. Este token é usado para validar o usuário sempre que um recurso é solicitado.

Você como programador enviará esse token para todos os serviços de mapas, serviços de consulta etc.

Esta página detalha como usar os serviços baseados em token .

A API Javascript do ArcGIS já vem com uma classe, o IdentityManager, para fazer isso.

Aqui estão alguns exemplos de como usar o Identity Manager.

Devdatta Tengshe
fonte
3

Na API do ArcGIS para JavaScript, há um widget chamado Identity Manager que aborda exatamente o que você deseja fazer. Confira exemplos que usam o gerenciador de identidades para ver como ele funciona.

A amostra vinculada pelo Devdatta, embora válida, é a maneira pré-Identity Manager de fazer isso e envolve muito mais código que é necessário agora que a autenticação para serviços seguros é inserida na API.

Derek Swingley
fonte
1
Acabei de pegar o link de amostra para a documentação da ESRI. A documentação pode ser atualizada para apontar para as novas amostras?
Devdatta Tengshe
2
Pessoal, obrigado por suas dicas, mas acho que você não entendeu meu ponto de vista. O cenário é: meu usuário acessará N serviços de mapas protegidos, o que significa que ele será incomodado N vezes com um prompt de login. Como TODOS os serviços de mapas do usuário podem ser acessados ​​usando as mesmas credenciais, gostaria que meu aplicativo pedisse APENAS UMA VEZ por eles e os usasse para autenticar automaticamente cada serviço de mapas. Nesta fase, acho que devo usar uma página proxy para lidar com a autenticação de vários serviços de mapas com o ArcGIS Server. Parece bom? Alguma alternativa mais direta? Agradecemos antecipadamente, espero que eu fiz minhas necessidades claro ..
csparpa
2

Você também pode usar o proxy, para que seu aplicativo nunca solicite nome de usuário e senha. E você não precisa configurar o Token para acessar serviços protegidos sempre que os estiver acessando. A única coisa que você precisa fazer é no seu arquivo JS, defina o seguinte: esriConfig.defaults.io.proxyUrl = "/proxy.ashx"; (por exemplo,. http: //localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true; E em seu arquivo proxy.config, fornecer todos os serviços que você está consumindo em sua aplicação.
Consulte https: //github.com/Esri/resource-proxy/ Para obter mais detalhes sobre o proxy, como você deseja autenticação baseada em token, no seu arquivo proxy.config, é necessário adicionar apenas o URL, o nome de usuário, a senha e o conteúdo matchAll.

Mayur Patel
fonte