通过RESTful API对ArcGIS Server安全层进行编程身份验证


16

我有一个ArcGIS 10.1 Server实例,该实例在Internet上公开了受保护的地图服务。我需要编写一个客户端应用程序(我目前正在使用ArcGIS Javascript API的3.3版本来构建)的代码,使用户可以查看那些受保护的Web服务:

我认为这个在线ESRI示例是一个好的开始。

我的意愿是不提示用户进行EACH mapservice身份验证,因为我已经知道所有mapservices都属于她/他,因此她/他可以使用相同的用户名和密码进行访问。在我的想法中,凭据提示仅应显示一次,因此JS代码应通过某种RESTful登录调用将凭据提供给每个mapservice。在我看来,ArcGIS Server REST API似乎没有提供这样的调用...也许我错了。

因此,这种使用ArcGIS Server登录到安全地图服务的“ RESTful”方式是否可行(从而可以通过编程方式访问安全服务)?如果是这样,你们中的任何人都可以提供示例或指向Web资源的链接对此进行解释吗?


请让我们知道ArcGIS GIS Server版本(10.0或10.1)吗?
Sunil 2013年

Sunil,我忘了写它,它是10.1!
csparpa

1
您在使用arcgis安全存储而不是Windows auth?
2013年

目前,@ Brad Nesom我的ArcGIS Server实例正在使用内置的安全存储(带有用户和角色),但我打算将实例链接到外部LDAP服务器以进行身份​​验证
csparpa 2013年

Answers:


11

我终于找到了我想要的东西:一个可以用来生成令牌的合适的ArcGIS Server Web端点!

呼叫是这样的:

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

它将令牌返回到HTTP响应主体中,并且可以将其发送到对安全资源的任何进一步请求,而无需再次提示输入凭据。令牌必须是Cookie请求标头的值,因为它当前存储在客户端的cookie中。

但是... 该死!该令牌生成器不是 ArcGIS Server REST API的一部分!!!我在在线API文档中找不到它!我在世界上哪里可以找到它???

这意味着ArcGIS Server没有RESTful身份验证框架。

例如,如果我们在ArcGIS REST API下公开了此地图服务:/arcgis/rest/services/myDir/myMapService/MapServer/layers并且我们尝试获取此资源,则从ArcGIS Server获得的是响应,响应中包含200: OK状态码和正文中的HTML文档(HTML是登录表单) )。从一个可能是RESTful的登录中,我希望该请求将给我返回一个401: Authentication Required状态代码以及一个WWW-Authenticate标头...我使用REST客户端程序自己对这件事进行了测试。


3
遗憾的是,大多数“ RESTful”实现都不是RESTful的:)几年前,我放弃了对此的严格限制,因为事实是,大多数实现都是“类似REST的”。对于您的特定用例,我通常采用不同的方法。我使用选择的内置身份验证系统并代理打开的ArcGIS请求。因此,如果我要使用Django认证,ruby或.net或其他工具来处理身份验证,那么我将使用该系统。然后,当该系统认为还可以时,您可以将请求代理到一个内部ArcGIS服务器/端口,该服务器/端口已被外界锁定。
Ragi Yaser Burhum 2013年

2
@Ragi Yaser Burhum,您好,您是对的:我们永远不会生活在完全RESTful的世界中;-)我还考虑了与您一样的方法:我喜欢拥有代理的想法(该代理还可以处理对ArcGIS Server以外的Web服务的请求,以及),但我需要将整个架构的复杂性保持在尽可能低的水平。因此,在发现可以通过编程方式对用户进行地图服务身份验证的直接方法之后,我将继续介绍!不管怎么说,还是要谢谢你!
csparpa

也许这是一个太老的问题,但是希望您可以看到Esri REST API现在具有GenerateToken方法:resources.arcgis.com/en/help/arcgis-rest-api/index.html#
//…

7

请查看ArcGIS Server安全性如何工作。

基本上,您将需要建立用户和组,并赋予某些服务特定的用户权限。

完成此操作后,您需要在JavaScript应用程序中使用基于令牌的安全性。这意味着,您要求用户提供其用户名和密码。它被发送到ArcGIS Server,后者验证凭据,然后发回令牌。每当请求资源时,此令牌都用于验证用户。

您以程序员的身份将此令牌发送给每个mapservice,query service等。

此页面详细介绍了如何使用基于令牌的服务

ArcGIS Javascript API已经带有一个类,IdentityManager可以执行此操作。

以下是有关如何使用Identity Manager 的几个示例


3

在ArcGIS API for JavaScript中,有一个名为Identity Manager的小部件,可以准确地满足您要执行的操作。查看使用身份管理器的样本,以了解其工作原理。

通过Devdatta链接的示例虽然有效,但却是身份管理器之前的方法,并且涉及许多代码,现在安全服务的身份验证已包含在API中,这是必需的。


1
我刚刚获得了ESRI文档的示例链接。可以更新文档以指向新样本吗?
Devdatta Tengshe 2013年

2
亲爱的,谢谢你的提示,但我想你没有理解我的意思。场景是:我的用户将要访问N个安全的地图服务,这意味着他将被登录提示困扰N次。由于可以使用相同的凭据访问所有用户的mapservice,因此我希望我的应用一次向其询问,然后使用它们来自动验证每个mapservice。在这个阶段,我想我应该使用代理页面来处理ArcGIS Server的多个mapservice身份验证。听起来不错?还有其他更直接的选择吗?在此先感谢,希望我做了我需要清楚..
csparpa

2

您也可以使用代理,因此您的应用程序将永远不会提示输入用户名和密码。而且,您无需将令牌设置为访问受保护的服务。您唯一需要做的就是在JS文件中设置以下内容:esriConfig.defaults.io.proxyUrl =“ /proxy.ashx”; (例如,http://localhost//DotNet/proxy.ashx ; esriConfig.defaults.io.alwaysUseProxy = true;并在proxy.config文件中,提供您在应用程序中使用的所有服务。
请参阅https: ////github.com/Esri/resource-proxy/获取有关代理的更多详细信息,因为您希望基于令牌的身份验证,所以在proxy.config文件中,仅需要添加url,用户名,密码和matchAll内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.