令牌和令牌服务
将 ArcGIS Server 安全性配置为 ArcGIS 管理的身份验证选项时需要使用令牌。令牌表示 ArcGIS Web 服务的用户标识。由令牌服务(一种 Web 服务)将令牌颁发给客户端应用程序。客户端应用程序必须提供受保护的 ArcGIS Web 服务的有效令牌才能对其进行访问。
ArcGIS 管理的基于令牌的身份验证
当客户端应用程序尝试访问受保护的 ArcGIS Web 服务时会依次发生以下事件:
- 客户端发出访问受保护的 ArcGIS Web 服务的请求。
- ArcGIS Web 服务做出响应要求使用令牌,同时将提供令牌服务的 URL。
- 客户端提供有效的用户名和密码向令牌服务请求令牌。
- 令牌服务验证用户名和密码,如果它们有效,则向客户端返回令牌。
- 客户端发出访问受保护的 ArcGIS Web 服务的请求,这次请求中包含令牌。
- ArcGIS 服务验证令牌,然后将对服务请求的响应发送回客户端。
利用令牌使用受保护的 GIS 服务
如果已启用令牌服务并且访问 ArcGIS Web 服务要求使用令牌,那么客户端软件必须能够按照上面的方式获取和使用令牌。ESRI 客户端应用程序(例如 ArcGIS Desktop)能自动处理从令牌服务获得令牌并对受保护的 ArcGIS Web 服务使用令牌这一过程。当连接到一个需要基于令牌的身份验证的 ArcGIS Server Internet 服务时,ArcGIS 客户端会产生如下行为。
ArcGIS Desktop(ArcMap、ArcCatalog):用户在连接对话框中输入有效的用户名和密码。如果未输入用户名或密码,或者登录信息不正确,软件会提示用户输入正确的凭据。输入正确的用户名和密码后,用户即可正常使用服务。
ArcGIS Explorer:与使用 ArcGIS Desktop 的行为相同。
Web ADF 应用程序(Java 和 Microsoft .NET Framework):Web 应用程序需要使用凭据才能进入 ArcGIS Server 管理器或开发环境。在 ArcGIS Server 管理器中,当在创建 Web 应用程序过程中添加 GIS 服务时需要输入用户名和密码。在开发环境(例如 Microsoft Visual Studio)中,将 GIS 资源添加到应用程序时需要输入用户名和密码。
JavaScript 应用程序(ArcGIS API for JavaScript、ArcGIS Extension for Google Maps API、ArcGIS Extension for Bing Maps,以及其他基于 REST 的应用程序):客户端必须能够提供令牌才能访问需要令牌的服务。大多数情况下,将服务的用户名和密码嵌入客户端 JavaScript 中是不合适的。但是,可以从令牌服务器获取长期令牌,而且此令牌可以包含在客户端页面中。因此令牌被包含在服务请求中。有关获取令牌的详细信息,请参阅 GetToken 网页。有关使用令牌请求访问资源的信息,请参阅相应的 API 帮助。
基于 SOAP 的应用程序:在不使用 ADF 连接类的情况下,使用 SOAP 工具包访问 GIS Web 服务的 WSDL 的应用程序需要显式获取和使用令牌。有关信息和示例,请参阅“ArcGIS Server 开发者帮助”。
在 Web 应用程序中,应用程序的最终用户不能在浏览器中输入访问 ArcGIS 服务的凭据。而应在 ArcGIS Server 管理器或 Eclipse/NetBeans IDE 中构建 Web 应用程序时指定访问 ArcGIS Web 服务的凭据。该凭据可用于 Web 应用程序的所有用户。要求输入登录信息可对 Web 应用程序本身施加保护,但是需要单独对此登录信息进行验证。可以使用 ArcGIS Server 管理器配置 Web 应用程序级别的安全性。通过自定义程序设计便可将凭据从最终用户传递到 ArcGIS Web 服务。有关详细信息,请参阅“ArcGIS Server 开发者帮助”。
配置令牌服务
令牌服务是作为 ArcGIS Server 的一部分安装的 Web 服务。它与维护用户和角色信息的主存储和安全性存储进行通讯,以对收到的令牌请求进行身份验证。对用户凭据进行身份验证后,会颁发令牌,并且可以通过此令牌使用受保护的 ArcGIS Web 服务。
在 ArcGIS Server 实例上启动令牌服务之前,需要对其进行配置。可以导航至管理器中的安全性 面板的设置 页面,然后单击 GIS 服务的安全性选项卡来配置令牌服务。选择选项 ArcGIS 令牌服务身份验证,然后单击配置来配置和启动 ArcGIS Server 实例上的令牌服务。
有关令牌超时值和共享密钥的详细信息,请参阅以下的“令牌的超时时间”和“令牌服务的共享密钥”部分。
令牌服务所需的安全连接 (HTTPS/SSL)
默认情况下,向令牌服务请求令牌时需要使用 HTTPS(安全套接字层,即 SSL)的安全连接。HTTPS 将在传输期间对用户名和密码加密。客户端在请求令牌时必须使用 HTTPS,使用方式有两种,一种是采用标准方法,也就是将用户名和密码包括在查询字符串(由 ArcGIS Desktop、Web ADF 控件和其他客户端使用)中,另一种是通过使用 GetToken.html 网页。
如果仅限于内部测试之用,可禁用对 HTTPS 的要求,以便能够使用非安全 HTTP 获取令牌。请注意,使用 HTTP 传送的密码可被连接到网络的任何人截获。
令牌的超时时间
启用令牌服务后,可设置令牌的超时时间,方法为导航至 ArcGIS Server 管理器中的安全性 面板的设置 页面,然后在 GIS 服务的安全性选项卡上单击配置。要维护令牌的安全性,每个令牌都需要和有效期相关联。如果使用的是已过期的令牌,最终用户将收到超时消息或其他错误消息。
有效期较短的令牌更安全,因为已损坏的令牌只能在较小的时间窗口内使用。但是,短有效期意味着应用程序需要更频繁地回收令牌,从而增加了开销。
随 ArcGIS Server 一同安装的令牌服务需要在配置过程中提供两个有效期:
短有效期(默认有效期)
如果客户端未在请求令牌时指定超时值或提供客户端标识符,则令牌服务颁发的令牌有效期较短。
ArcGIS Desktop 客户端和 Web ADF 应用程序在使用受保护的 ArcGIS Web 服务时使用的令牌有效期较短。
长有效期(最大有效期)
此有效期是令牌服务可颁发的最大有效期。在提出请求时,所有为令牌指定有效期的令牌请求必须提供客户端 ID。提供客户端 ID 时,客户端可以请求有效期介于一分钟和长有效期(最大有效期)之间的令牌。如果请求的令牌的有效期长于最大有效期,则会导致错误。
要使用受保护的服务的 JavaScript 开发人员可以使用 GetToken 网页来请求指定有效期的令牌。
有关如何请求令牌的详细信息,请参阅以下的“请求令牌”部分。
令牌服务的共享密钥
令牌服务的共享密钥用于为令牌加密。令牌通过用户名和其他信息进行加密,然后发送到客户端。客户端发出的访问 ArcGIS Web 服务的请求中包括令牌。然后,服务器将使用共享密钥对令牌进行解密。服务器验证客户端的身份后才允许客户端访问 ArcGIS Web 服务。如果存在共享密钥,则证明服务器已创建令牌。
由于共享密钥对于验证客户端身份和客户端获得授权至关重要,因此密钥必须设置为适当长度的唯一值。要设置共享密钥,可以导航至安全性 面板上的设置 页面,然后单击 GIS 服务的安全性选项卡上的配置。在出现的配置本地令牌服务 对话框中设置属性用于加密令牌的共享密钥的值。密钥的长度应为 16 个字符(超出 16 个字符以外的任何字符均不会被采用)。建议使用一组随机字符设置密钥。任何字符都可以使用,包括非字母数字字符。应将密钥设置为任何有可能截获令牌的人都无法轻易猜中的值。由于用户无需使用或记住密钥,因此设置密钥与设置密码不同,复杂的密钥值并不会对用户造成不便。
可使用高级加密标准 (AES) 中的加密方法(又称 Rijndael)通过密钥对令牌进行加密。密钥中的 16 个字符表示用于加密的 128 位。
有关加密和 AES 的详细信息,请查阅安全性参考资料,或咨询贵组织内具有安全性和密码学专业知识的人员。
GetToken 网页
令牌服务中附带了用于手动请求令牌的 HTML 网页。通常只在使用 ArcGIS Server API for JavaScript 构建 Web 应用程序时或在进行测试和故障排除时才需要该网页。Web ADF 应用程序和 ArcGIS Desktop 等客户端可自动检索令牌,因此并不需要该网页。GetToken 网页所在的 ArcGIS Server 实例位于 https://<Web 服务器>:<端口>/arcgis/tokens/gettoken.html(或者,如果已导出令牌服务并将其部署在 Web 服务器上,可以用 Web 服务器域名替换 <Web 服务器>,并使用指向已部署的应用程序的上下文路径替换 arcgis/tokens)。
要使用 GetToken 页面,请输入以下信息:
- 用户名和密码:ArcGIS Server 上的 ArcGIS Web 服务的有效用户凭据。有效用户是指使用设置 面板上的 ArcGIS Server 管理器配置的用户。
- 客户端 ID:发出访问 Web 服务的请求的计算机的标识符。具有客户端 ID 才能获得使用期限较长的长期令牌;使用 ArcGIS API for JavaScript 时通常会要求具有客户端 ID。指定客户端 ID 的方法共有两种:
- IP 地址:这将使令牌与指定的计算机绑定。如果始终在指定的计算机中使用令牌,则可使用该选项,例如在通过 ArcGIS Server API for SOAP 构建的 Web 应用程序中(在此应用程序中将由服务器发出访问 ArcGIS Web 服务的请求)。在测试和排除 ArcGIS Server 故障时也可使用这种方法。
- HTTP referrer:这是发出访问 ArcGIS Web 服务请求的页面的 URL。如果通过 ArcGIS Server API for JavaScript 或其他基于 REST 的应用程序来构建应用程序(各客户端在此应用程序中发出通过 ArcGIS Web 服务直接访问地图和数据的请求),可使用此方法。
- 有效期: 令牌的有效期,该值介于一分钟到最大值之间。
令牌请求格式
要从服务器获取令牌,需发出 URL 请求。ArcGIS Desktop、Web ADF、Web API 和移动客户端等使用令牌的客户端都使用此方法,且使用方式与上述 GetToken 页面相同。
使用 tokens 端点请求令牌
可使用 tokens 端点请求令牌。例如,以下 URL 可用于从服务器获取令牌:
https://myserver.example.com/arcgis/tokens?request=gettoken&username=myuser&password=secret1&clientid=ref.myserver.example.com&expiration=1440&f=json&callback=myfunction
该请求可为用户 myuser 获取一个运行于同一服务器 (myserver.example.com) 的 Web 应用程序的令牌,有效期为一天(1440 分钟)。
可以指定查询字符串中的以下参数:
request:此参数的值始终为 gettoken (request=gettoken)。必填信息。
username:用户在系统上的用户名。必填信息。
password:用户在系统上的密码。必填信息。
注意:HTTPS/SSL 在令牌传输期间对用户名和密码进行加密。有关详细信息,请参阅上文的安全连接 (HTTPS/SSL)。
clientid:用于标识客户端的可选参数。在类型和值之间使用一个“.”字符。如果未指定 clientid,令牌将使用短期令牌超时设置。
值:
ip:客户端的 IP 地址。
示例:clientid=ip.10.14.102.85
ref:使用此令牌的 webapp 的基本 URL。如果客户端参数的值是 referrer,则必须指定此参数。
示例:clientid=ref.http://myserver/mywebapp
requestip:如果将值指定为 requestip(请求 IP),则为发出请求的 IP 生成令牌。
示例:clientid=requestip
expiration:可选参数,指定令牌发出后的有效期。该值以分钟为单位。如果未包括此参数,expiration 将使用短期令牌超时设置。
f:作为 ArcGIS Server 10.0 Service Pack 1 (SP1) 的新增功能,此可选参数用于指定输出格式。它接受值“json”,以 json 格式返回结果。如果未指定此参数,将以文本格式生成令牌。
示例:{"token":"hjSXkAQl2uczsyE9T3NDvhcso6WVYWSAqBcn1GFB-L8.","expires":"1289513369381"}
有效期以毫秒表示,计算的起始时间为 1970 年 1 月 1 日。
callback:可选参数,用于指定回调函数的名称。包含 callback 时,将始终以 json 格式返回输出。
使用 generateToken 端点请求令牌
作为 ArcGIS Server 10.0 Service Pack 1 (SP1) 的新增功能,您还可以使用 generateToken 端点请求令牌。例如,以下 URL 可用于从服务器获取令牌:
https://myserver.example.com/arcgis/tokens/generateToken?username=myuser&password=mypass&client=referer|ip|requestip&referer=referer&ip=ipaddress&expiration=expiration&f=json&callback=myfunction
可以指定查询字符串中的以下参数:
username:要生成令牌的用户名。必填信息。
password:用户名的密码。必填信息。
注意:HTTPS/SSL 在令牌传输期间对用户名和密码进行加密。有关详细信息,请参阅上文的安全连接 (HTTPS/SSL)。
client:用于标识客户端的可选参数。如果未指定 clientid,令牌将使用短期令牌超时设置。
值:
referer:使用此令牌的 webapp 的基本 URL。如果客户端参数的值是 referrer,则必须指定此参数。
示例:referer=http://myserver/mywebapp
ip:使用令牌的计算机的 IP 地址。如果客户端参数是 ip,则必须指定此参数。
示例:ip=10.14.102.85
requestip:如果将值指定为 requestip(请求 IP),则为发出请求的 IP 生成令牌。
expiration:可选参数,指定令牌发出后的有效期。该值以分钟为单位。expiration 不能比长期令牌所允许的最长时间长。
示例:expiration=60
注意:如果不包括 client 和 expiration 参数,将生成短期令牌,expiration 将使用短期令牌超时设置。
f:用于指定输出格式的可选参数。它接受值“json”,以 json 格式返回结果。如果未指定此参数,将以文本格式生成令牌。
示例:{"token":"hjSXkAQl2uczsyE9T3NDvhcso6WVYWSAqBcn1GFB-L8.","expires":"1289513369381"}
有效期以毫秒表示,计算的起始时间为 1970 年 1 月 1 日。
callback:可选参数,用于指定回调函数的名称。包含 callback 参数时,将始终以 json 格式返回输出。