在Web程序中访问受保护的服务

2
分享 2022-07-19
        考虑到数据的安全,很多用户会将ArcGIS Server、ArcGIS Online或ArcGIS Enterprise中的内容设置为仅限于授权用户访问。对于这部分服务,如何在web应用程序中使用呢? 我们今天来探讨下对应的解决方案。
        身份认证是处理所有应用程序安全的常用方法,这是回答应用程序“你是谁?”这一问题的唯一方法。ArcGIS平台提供了许多身份验证方式来确保用户对组织中内容的访问, ArcGIS API for JavaScript对这些身份验证方法也提供了全面的支持:
 
  • OAuth 2.0 — secures delegated access to server resources.
  • API Keys — a unique identifier used to authenticate a user, developer, or calling program to ArcGIS.
  • ArcGIS Tokens — Esri's proprietary token-based authentication mechanism.
  • Network credentials — HTTPS secured service / Integrated Windows Authentication (IWA).


        基于这些身份认证方法,在Web应用程序中访问受保护的服务,可以采用应用程序登录(Application logins)和用户登录(User logins)两种途经实现。
 
1. 应用程序登录

        应用程序登录的方式可以应对的场景是:管理者对ArcGIS Server、ArcGIS Online或ArcGIS Enterprise中的内容进行了安全设置,但是希望通过应用程序使用这些受保护的内容时,不需要用户登录就能访问到。

方案1:使用代理

        Esri提供了代理程序,用户可以获取后部署在组织中,并将凭据存储在代理中,之后在程序中通过代理访问受保护的服务。

        步骤如下:
        1) 获取代理
        代理程序的下载地址是:https://github.com/Esri/resource-proxy ,有DotNet、JAVA和PHP三个版本可选,下载后部署在相应的Web Server中。
        2) 配置代理
        在代理的配置文件中,填写要代理的ArcGIS Server服务地址,以及身份信息。身份信息可以使用username,password和tokenServiceUri,也可以是clientId,clientSecret和oauth2Endpoint,也可以直接填写token信息:accessToken。
        如果要限制代理只用于某些应用程序,在配置文件中,填写allowedReferers,这样只有来自列表中引用者的请求才会被代理。
        具体配置文件中各个参数的说明,请见https://github.com/Esri/resource-proxy的配置介绍。
        3) 在程序中使用代理
        在程序中通过addProxyRule接口添加代理URL。

1.png


        注意:如果要通过proxy加载场景图层,需要在请求返回的Response headers中增加“Access-Control-Allow-Credentials: true”,同时,“Access-Control-Allow-Origin” header信息值不能是“*”。以DotNet版本的proxy为例,可以在 其中的Web.config中增加如下customHeaders信息,Access-Control-Allow-Origin与应用程序请求中的origin header值保持一致。

2.png


方案2:将凭据与图层项目一同存储

        将受保护的 ArcGIS Server 服务添加到ArcGIS Portal或者ArcGIS Online时,可以将访问服务需要的凭据随这个项目一同存储,之后在程序中使用新的项目的服务地址访问数据。
        这个方法的行为与代理相似,所有服务请求均通过 Portal for ArcGIS并进行转发,其速度比直接发送到服务略有延迟。

        步骤如下:
        1) 打开 Web 浏览器并导航到 Portal for ArcGIS 主页。
        2) 导航到内容>我的内容>新建项目。
        3) 单击URL以添加来自 Web 的项目。
        4) 键入服务的 REST URL,例如:
        https://xiej.geosceneoffice.co ... gt%3B
        5) 启用“将凭据与服务项目一同存储。 不提示身份验证。”选项,然后单击下一步。

3.png


        6) 输入有权访问该服务的帐户的用户名和密码,然后单击下一步。
        7) 查看所有字段值的内容,然后单击保存。
        8)如果要控制访问安全服务的访问者,可以指定访问安全服务的特定 referrer URL 或 IP来限制使用。进入项目详细信息页面中,转到设置选项卡,单击限制使用按钮,填写可以访问服务的引用网址或者 IP 地址,单击添加,然后单击确定,随后单击页面底部的保存按钮。

4.png


        9) 返回这个项目的详细信息页面并与所有人共享。
        10) 在这个项目的详细页面的右下角,拷贝URL,在程序中使用。
        注意:此方法不适合场景图层等I3S图层。

方案3:使用Token

        ArcGIS平台支持使用ArcGIS Token 和 OAuth 2.0 Access Token,用户可以通过不同的方式获取到Token, 然后在程序中使用。常见的方式有:

        1) 硬编码方式使用Token

        步骤如下:
        (1) 预先创建长有效期的Token
        以ArcGIS Token为例,对于独立的ArcGIS Server站点,生成Token的URL格式是:https://gisserver.domain.com:6443/arcgis/tokens ;对于联合的ArcGIS Server站点,生成Token的URL格式是:https://machine.domain.com/web ... Token     
5.png


        填写用户名和密码,客户类型选择Webapp URL,输入应用程序的地址。这种方式生成的Token只在来自该应用程序的请求中生效,可以起到安全保护作用。
指定Token有效期。对于独立的ArcGIS Server站点,指定的有效期必须小于或等于为长期令牌有效期配置的值。可以在 ArcGIS Server Manager 中查看当前令牌属性,请单击安全性 > 设置,然后单击令牌设置旁的编辑图标。对于联合的ArcGIS Server,在此Generate Token接口中可以指定的最长有效期为 15 天。
        (2) 在程序中使用Token
        使用 IdentityManager 接口的registerToken方法注册上一步骤生成的  ArcGIS Token 或者 OAuth 2.0 Access Token。对于 ArcGIS Online 和 Portal, registerToken方法中的server填写 https://www.arcgis.com/sharing/resthttps://www.example.com/portal/sharing/rest;对于独立的ArcGIS Server站点, registerToken方法中的server填写https://www.example.com/arcgis/rest/services.一旦Token在IdentityManager中注册, 随后应用程序在访问受保护服务时会自动在请求上附带Token信息。

6.png


        2)动态获取Token

        在用户使用应用程序时,动态生成一个短有效期的Token使用。生成Token需要username/password或者clientId/clientSecret信息,而本章节讨论的应用情景是用户在访问应用程序时不需要输入账户信息,在这种情况下,如果直接把密码或者clientSecret嵌入到程序中,存在泄漏的风险,我们是不推荐硬编码这种做法的。建议用户创建服务器端组件,服务器端组件向ArcGIS平台发起生成Token的请求来获取Token, 随后传递给客户端,客户端使用 IdentityManager 接口的registerToken方法注册Token使用。安全起见,服务器端组件也需要被保护,以便只有应用程序及其预期用户可以访问它。

2. 用户登录

        使用应用程序登录的工作流程并非100%安全,如果十分关注数据的安全性,我们的建议是,应该要求最终用户在应用程序中通过登录来访问这些内容以确保其安全性。
        ArcGIS Token 和OAuth 2.0两种身份认证方式都支持用户登录的模式。在这种模式下,用户在访问应用程序时,应用程序负责提供一个登录对话框,提示用户输入他们的凭据,之后应用程序负责传输这些凭据到服务器进行身份认证,如果凭据正确,就会生成一个令牌返回,可以在后续请求中使用该令牌。
        ArcGIS API for JavaScript提供了IdentityManager和OAuthInfo类(后者在OAuth 2.0方法中使用)帮助开发者完成身份认证和授权的流程。

认证方式1:ArcGIS Token

        对于使用ArcGIS Token 的认证方式,实现流程是:
        1) 生成Token
        用户通过登录对话框UI输入账户之后,使用IdentityManager类的generateToken方法生成Token。
        2) 使用Token
        使用 IdentityManager 类的registerToken方法注册Token。对于 ArcGIS Online 和 Portal, registerToken方法中的server填写 https://www.arcgis.com/sharing/rest 和 https://www.example.com/portal/sharing/rest;对于独立的ArcGIS Server站点, registerToken方法中的server填写https://www.example.com/arcgis/rest/services

认证方式1:OAuth 2.0

        对于使用OAuth 2.0的认证方式,实现流程是:
        1) 添加应用程序
            (1) 打开 Web 浏览器并导航到 Portal for ArcGIS 主页。
            (2) 导航到内容>我的内容>新建项目,选择应用程序
            (3) 对于Web应用程序,选择Web制图,并输入应用程序的URL,单击下一步;
            (4) 输入标题、文件夹、标签和摘要信息,单击保存;

        2) 注册应用程序
            (1) 在Portal内容页面-我的内容选项卡中,单击上一步骤添加的应用程序的标题,进入项目页面。
            (2) 单击设置选项卡。 向下滚动到应用程序注册部分,然后单击注册。
            (3) 设置应用程序的类型为浏览器。
            (4) 对于每个重定向 URI,请以 ["https://<server>[:port]"] 格式输入地址,然后单击添加。重定向 URI 是指用户在成功登录后要重定向的地址 。
            (5) 添加完成后单击注册。此时可以看到应用程序的注册信息,包括应用程序ID(clientId)和应用程序保密问题(clientSecret)。

        3) 注册OAuth信息
            创建OAuthInfo对象并将其注册到IdentityManager中。

7.png


        4) 获取Credential信息
            获取Credential信息,检查用户是否已经是登录状态,如果已经登录,则可以访问受保护的服务。

8.png


        5)销毁凭据
            用户登出应用程序时,使用IdentityManager类的destroyCredentials方法销毁凭据。
 
        以上是我们经常使用的访问安全服务的方式,开发者可以基于不同的场景,不同的安全需求选择适合的身份验证方式。无论采用哪种身份验证方式,为了避免泄漏用户名/密码以及重放攻击,建议所有请求都使用https,这将对客户端与ArcGIS 服务器之间的所有通信进行加密。如果需要通过Ajax获取令牌, GET请求可能会在网络设备历史和浏览器历史中留下用户名/密码,建议通过POST请求获取。

1 个评论

好! 个人推荐开发者用OAuth 2.0 将用户统一到门户登录上。

要回复文章请先登录注册