配置令牌服务
如果使用的是 ASP.NET 身份验证(即,通过 SQL Server 或自定义提供程序进行用户存储和角色存储),可通过令牌服务验证用户身份。令牌将充当访问安全服务的密钥,且仅会授予经过身份验证的用户。令牌是包含用户名、有效期及其他信息的加密信息字符串。可通过 <ArcGIS Server Instance>/Tokens 上的可用 Web 服务为经过验证的用户授予令牌。
令牌可在一定程度上保障 Web GIS 服务的安全,但却不如某些其他方法安全,如集成 Windows 身份验证。采用令牌的系统的安全性取决于用户对访问令牌的控制情况。默认情况下,请求令牌要求使用安全连接 (HTTPS),但您也可以设定所有使用令牌的请求均使用 HTTPS。这意味着需要使用 HTTPS 访问包含受保护的 GIS 服务的文件夹。要将服务文件夹设定为要求使用 HTTPS 进行访问,可在管理器或 ArcCatalog 中打开文件夹属性,然后选中需要加密的 Web 访问复选框。
令牌服务是一项 Web 服务,在安装 ArcGIS Server 时随 ArcGIS Web 应用程序组件一同安装。在本软件的现行版本中,令牌服务将于必要时自动启用。如果您指定将用户存储在 Microsoft SQL Server 或自定义成员提供程序中,令牌服务将被启用(请参阅有关设置用户和角色的概述)。而如果您指定使用 Windows 用户帐户验证 GIS 服务用户的身份,则令牌服务不会被启用或使用,除非您使用 SQL Server 或自定义提供程序存储角色并启用用于用户身份验证的令牌。
令牌服务启用后,您便可以为令牌设置最大允许超时时间。令牌超时时间中对此设置进行了详细说明。此外,您还可以将安装程序的加密密钥设置为唯一值;请参阅令牌服务的共享密钥。这些便是有关令牌服务的唯一几项配置。
如果访问 GIS 服务需要使用令牌,客户端软件将按如下步骤使用 GIS 服务:
- 客户端发出访问 GIS 服务的请求。
- GIS 服务器作出响应要求使用令牌,同时将提供令牌服务的 URL。
- 客户端提供有效的用户名和密码向令牌服务请求令牌。
- 令牌服务在数据库(或自定义成员资格提供程序)中验证用户名和密码,如果用户名和密码有效,则向客户端返回令牌。
- 客户端发出访问 GIS 服务的请求,这次请求中包含令牌。
- GIS 服务器验证令牌,然后将对服务请求的响应发送回客户端。
如果要允许用户在不提供令牌或登录信息的情况下访问服务,应执行那些操作?您可以通过使用“任何人”角色来允许对服务或文件夹进行匿名访问(请参阅设置服务或文件夹的权限)。
如果令牌服务已启用且访问 GIS 服务要求使用令牌,那么客户端软件必须能够如上所述获取和使用令牌。ESRI 客户端可自动获取和使用令牌。连接到需要登录的 ArcGIS Server Internet 服务时,客户端的行为如下所述:
- ArcGIS Desktop(ArcMap、ArcCatalog)、ArcGIS Explorer 和 Web ADF 应用程序:用户在连接对话框中输入有效的用户名和密码,才能访问桌面应用程序或开发环境中的服务。由应用程序负责与令牌服务进行通信并获取有效令牌。不需要用户或开发人员与令牌服务直接交互。
- 基于 REST 的应用程序(JavaScript、Flex、Silverlight/WPF 和 SharePoint):由于这些应用程序在浏览器中运行,因而具备访问权限的任何人均可查看这些应用程序,所以不建议将访问服务要使用的用户名和密码嵌入应用程序中。替代做法是,通过令牌服务获取令牌。然后,令牌便会包含于服务的 URL 请求中(例如 http://url.to.service?token=<令牌字符串>)。有关获取令牌的详细信息,请参阅本主题中的 GetToken 网页部分。有关使用令牌请求访问资源的信息,请参阅对应的 API 资源。
- 基于 SOAP 的应用程序:在不使用 ADF 连接类的情况下,使用 SOAP 工具包访问 GIS Web 服务的 Web 服务描述语言 (WSDL) 的应用程序需要显式获取和使用令牌。有关信息和示例,请参阅 ArcGIS Server SOAP SDK。
请注意,如果是在 Web 应用程序中使用令牌,应用程序的终端用户不在浏览器中输入访问 GIS 服务的凭据。访问服务的登录信息必须在管理器或开发环境中提前指定。Web 应用程序的所有用户均使用相同的凭据。通过要求输入登录信息的方式可对 Web 应用程序本身施加保护,但是此登录信息将会根据管理器或其他载体中的 Web 应用程序的安全性配置进行单独验证。通过自定义程序设计便可将凭据从终端用户传递到 GIS 服务。有关详细信息,请参阅“开发人员帮助”。如果使用 IIS 身份验证(用户将存储在 Windows 中),凭据会自动从应用程序传递到基础 Web 服务。
在管理器中,您可以对令牌服务的若干个参数进行设置:令牌的过期窗口(短期和长期)以及共享的加密密钥。下面将对这两个设置分别进行介绍。
令牌超时时间
令牌服务启用后,便可通过管理器中的“安全性设置”设定令牌超时时间。超时时间用于确定令牌呈有效状态的时间长度。如果使用的是已过期的令牌,终端用户将收到超时消息或其他错误消息。
令牌超时时间越短,安全性越高;但如果应用程序未检测到令牌超时因而并未获得新令牌(Desktop 和 ADF 客户端允许获取新令牌),令牌超时时间较短则可能导致合法用户在使用服务期间遭遇令牌超时的问题。为令牌设置超时时间的目的是限制未经授权的使用。如果黑客得以监视授权用户与服务器间的通信,则令牌很可能被该黑客捕获。如果令牌被截获,便可通过超时时间来限制黑客的使用时间。因此为了提高安全性,您最好将令牌超时时间设置为较小的值。但短令牌超时时间的缺点是,开发人员需要在令牌超时之前将新令牌嵌入应用程序。
编写自定义应用程序时,最好将程序编写为检测令牌是否超时并及时显示相应的消息或者获取新令牌。有关详细信息,请参阅“开发人员帮助”。
两个令牌过期窗口将在安全性 > 设置页面上进行定义:
- 短期令牌:该超时设置的适用情况为,客户端在无客户端 ID 或有客户端 ID 但无有效期的条件下请求令牌。此处设置的超时时间值仅适用于短期令牌。ArcGIS Desktop 和 Web ADF 应用程序使用该超时设置。
- 长期令牌:该超时设置通常适用于基于 REST(JavaScript、Flex、Silverlight/WPF 和 SharePoint)的应用程序。管理器中的长期令牌超时时间设置通常比短期令牌长的多。该超时设置是最大允许值:客户端可请求时间跨度长达管理器中所设最大值的令牌。要获得长期令牌,客户端的请求中必须包含客户端 ID 和有效期。客户端 ID 可为客户端 IP 地址,也可为 Web Referrer URL(客户端浏览器正在使用的 Web 应用程序的 URL)。请求中还必须包括令牌超时时间。如果尚未指定超时时间,将使用为短期令牌指定的超时时间。
避免令牌被捕获和未经授权的使用的好方法是,规定与 GIS 服务之间的所有通信都使用 HTTPS (SSL)。要实现此目的,对于 ArcGIS/服务 Web 应用程序,您最好要求使用安全通信协议 (SSL)。有关对于 IIS 中的应用程序要求使用 HTTPS (SSL) 的说明,请参阅设置 SSL。
令牌服务的共享密钥
令牌服务的共享密钥用于为令牌加密。令牌通过用户名和其他信息进行加密,然后发送到客户端。客户端发出的访问 GIS 服务的请求中包括令牌。然后,服务器将使用共享密钥对令牌进行解密。服务器验证客户端的身份后才允许客户端访问 GIS 服务。如果存在共享密钥,则证明服务器已创建令牌。
由于共享密钥对于验证客户端身份和客户端获得授权至关重要,因此密钥必须设置为适当长度的唯一值。令牌服务启用后,管理器会将共享密钥设置为随机值。您可根据需要自行设置密钥值。要设置共享密钥,请转至管理器中的安全性 > 设置,然后在令牌服务标题下单击设置按钮。在弹出的设置 对话框的共享中设置密钥值。密钥的长度应为 16 个字符(超出 16 个字符以外的任何字符均不会被采用)。建议使用一组随机字符设置密钥。任何字符都可以使用,包括非字母数字字符。应将密钥设置为有可能截获令牌的任何人都无法轻易猜中的值。由于用户无需使用或记住密钥,因此设置密钥与设置密码不同,复杂的密钥值并不会对用户造成不便。
可使用高级加密标准 (AES) 中的加密方法(又称 Rijndael)通过密钥对令牌进行加密。密钥中的 16 个字符表示用于加密的 128 位。有关加密和 AES 标准的详细信息,请查阅安全性参考资料或咨询贵组织内具有安全性和密码术专业知识的人员。
GetToken 网页
令牌服务中附带了用于手动请求令牌的 HTML 网页。通常只在使用 ArcGIS JavaScript API 构建 Web 应用程序时或在进行测试和故障排除时才需要该网页。Web ADF 应用程序和 ArcGIS Desktop 等客户端可自动检索令牌,因此并不需要该网页。GetToken 位于 https://<Web 服务器>/ArcGIS/Tokens/gettoken.html(如果安装在非默认实例名称下,则用该名称替换 ArcGIS)的 Web 服务器上。
要使用 GetToken 页面,请输入以下信息:
- 用户名和密码,对于 GIS 服务器上的 GIS Web 服务它们必须是有效的。有效用户是指之前在 ArcGIS Server 管理器的安全性 > 设置下设置的用户。
- 客户端 ID,用于识别发出访问 Web 服务的请求的计算机。具有客户端 ID 才能获得使用期限较长的长期令牌;使用基于 REST 的 API 时通常会要求具有客户端 ID。客户端 ID 可确保,如果令牌在传输期间被捕获,第三方无法轻易利用令牌发出访问 GIS 服务器的请求(请注意,以下两项中的任何一项都存在假冒的可能)。指定客户端 ID 的方法共有两种:
- IP 地址:这将使令牌与指定的计算机绑定。如果始终在指定的计算机中使用令牌,则可使用 IP 地址,例如在通过 ArcGIS Server SOAP API 构建的 Web 应用程序中(在此应用程序中将由服务器发出访问 GIS Web 服务的请求)。在测试和排除 GIS 服务器故障时也可使用这种方法。
- HTTP Referrer:这是发出访问 GIS Web 服务请求的页面的 URL(无 HTTP(s) 前缀)。如果通过 ArcGIS JavaScript API 或其他基于 REST 的 API 构建应用程序(各客户端在此应用程序中发出通过 GIS Web 服务直接访问地图和数据的请求),可使用此方法。例如,如果应用程序由 http://www.esri.com 托管,则会将 www.esri.com 用作引用网站。如果是从多个子域(如 gis.esri.com)访问此应用程序,则只需使用这两个 URL 中相同的那部分 URL。在本例中,引用网址为 esri.com。请注意,不要使引用网址短于规定长度,因为这样会削弱令牌的安全性。
- 有效期,即发出请求到令牌到期的时间。如果客户端尝试在令牌到期后发出请求,则将返回令牌到期代码。ESRI 客户端(Desktop、ArcGIS Explorer 和 Web ADF)了解如何获取新令牌。其他客户端可能需要重新启动应用程序。设定了客户端 ID 后才能使用指定的有效期。如果客户端 ID 被遗漏,有效期将使用管理器中设置的短期令牌时间。如果请求中包含客户端 ID,但有效期超出了管理器中为长期令牌配置的最大时间,则改用在管理器中为长期令牌配置的时间。
如果担心可能会对 GetToken 页面使用不当,可通过 IIS 管理器或设定文件系统权限将其删除或限制对它的访问。请注意,即使 GetToken 网页不可用,仍可以下一部分中介绍的请求格式,通过向文件夹发出 gettoken 请求的方式向令牌服务发出令牌请求。
令牌请求格式
要从服务器获取令牌,需发出 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 格式返回输出。
令牌服务所需的安全连接 (HTTPS/SSL)
默认情况下,向令牌服务请求令牌时需要使用 HTTPS(安全套接字层,即 SSL)的安全连接。HTTPS 将在传输期间对用户名和密码加密。客户端在请求令牌时必须使用 HTTPS,使用方式有两种,一种是为采用标准方法,即把用户名和密码包括在查询字符串(由 ArcGIS Desktop、Web ADF 控件及其他客户端使用)中,另一种是通过 GetToken.html 网页使用。
如果仅限于内部测试之用,可禁用对 HTTPS 的要求,以便能够使用非安全 HTTP 获取令牌。请注意,使用 HTTP 传送的密码可被连接到网络的任何人截获。只有在您组织的政策禁止在开发计算机上安装 IIS Web 服务器的情况下,才需要在开发服务器上使用 HTTP 获取令牌。这种情况下,通常会在不支持使用 SSL/HTTPS 的 Visual Studio (Cassini) 中使用基于文件的 Web 服务器来完成开发。IIS 可用时,应始终使用 SSL 来防止用户名和密码被捕获和遭到未经授权的使用。有关设置 SSL 的信息,请参阅设置 SSL。
要将令牌服务设置为允许使用非安全 HTTP 请求令牌,请按以下步骤操作:
- 用文本或 XML 编辑器打开文件 <Web server root>\ArcGIS\Tokens\web.config(如果 ArcGIS 实例不在默认位置 C:\Inetpub\wwwroot\ArcGIS,则转至 ArcGIS 实例的位置)。
- 在 <appSettings> 部分中找到以下标签。如果标签不存在,则添加它们。
<appSettings> <add key="RequireSSL" value="True" /> <add key="TokenServiceURL" value="XYZ" /> <appSettings>
- 将 RequireSSL 键设置为 False,然后将 TokenServiceURL 的值从 https 更改为 http。然后保存文件。不需要重新启动 IIS,因为 web.config 文件中的任何更改都会重新启动令牌服务应用程序。
- 在 <Web server root>\ArcGIS\rest 和 <Web server root>\ArcGIS\Services 中对 web.config 文件重复执行以上步骤。
请记得在适当的时候恢复 SSL 要求。要在令牌服务中重新启用 SSL 要求,请将 RequireSSL 设置恢复为 True,将 TokenServiceURL 设置为使用 https,然后保存文件。对 Tokens、rest 和 Services 文件夹中的每个 web.config 文件分别执行该操作。
将令牌服务设置为支持通过 Internet 访问
如上所述,ArcGIS Desktop、ArcGIS Explorer 和 Web ADF 客户端需要访问令牌服务才能为安全服务请求令牌。将 ArcGIS Server 实例设置为支持通过 Internet 访问时,需要更改用于访问令牌服务的 URL,以便能够在 Internet 中找到令牌服务。
安装 ArcGIS Server 时,它会在用于访问令牌服务的 URL 中存储计算机名。在可以解析该计算机名的 Intranet 环境中,这将正常工作。但在将计算机设置为可通过 Internet 访问时,客户端便无法解析该计算机名。
要修复此问题,必须更改 ArcGIS Server 实例(<Web Root>\<ArcGIS Server 实例名称>)的 rest、Services 和 Tokens 文件夹中的三个 web.config 文件。在文本编辑器中打开每个 web.config 文件,然后按以下步骤操作:
- 在 appSettings 元素中,找到具有以下键的元素:TokenServiceURL。
- 将此键的值由 https://<计算机名>/ArcGIS/tokens 更改为 https://<公共域名>/ArcGIS/tokens。