ArcGIS Server 基於Token安全驗證

一、ArcGIS Server 基於Token安全驗證

寫在前面:只使用token並不能起到安全驗證的作用,ArcGIS Server文件夾的權限是開放的,我們不需要登錄Server平臺即可訪問服務,所以我們應該將Token驗證和文件夾的安全性結合起來使用,將文件夾的權限設爲私有,這樣必須先要登錄才能訪問服務。

當我們的服務發佈到外網,但是我們又不希望其他人員訪問我們的服務。這時我們就需要對服務的請求進行驗證,類似於使用用戶名和密碼進行登錄。相當於先用進行驗證,驗證成功再響應服務請求。實質上我們在請求服務的過程就進行了兩步操作。在ArcGIS API for JavaScript中如何實現這兩步操作?我們可以使用代理的方式,即在客戶端和GIS服務器之間再添加一個服務,這個服務首先接收我們客戶端的請求,然後根據配置文件裏面的用戶名和密碼第一個和GIS服務器握手,並獲取token,將獲取到的token返回到代理服務,代理服務再將我們客戶端請求的url和token進行合併,向GIS服務器請求服務,GIS服務器解析token,並相應請求給代理服務,代理服務返回結果給客戶端:

在Web系統中使用Token驗證(.NET版本):

  1. 首先,爲ArcGIS Server添加用戶和角色:

2.爲服務所在文件夾設置權限,進入到服務--》管理服務--》選中站點--》鼠標放在菜單--》編輯文件夾安全性--》私有--》賦角色:

3.在https://github.com/Esri/resource-proxy/releases 下載代理頁面,我們只需要proxy.ashx和proxy.config文件,也可選擇本文末尾作者提供的實例(建議使用);

4.進入Web工程,將proxy.ashx和proxy.config添加到項目目錄,最好和JS文件在同一目錄;

5.修改proxy.config:

<serverUrl url ="http://192.168.1.6:6080/arcgis/rest/services"
               matchAll="true"
               dynamicToken="true"
               host="192.168.1.6:6080"
               userName="yangtao"
               password="262728"></serverUrl>
修改url中ip爲GIS服務器ip;host也爲GIS服務器ip;userName爲在Server裏面添加的用戶;password爲用戶密碼。

6.在require中設置代理:

esriConfig.defaults.io.proxyUrl = "proxy.ashx";
esriConfig.defaults.io.alwaysUseProxy = true;

alwaysUseProxy爲true表示始終使用代理,在測試過程,若底圖使用ersi地圖,出現錯誤,用天地圖則跳過代理,實現只是對服務使用代理。

目錄結構:

index.html、proxy.confog和proxy.ashx統計目錄,也可以不同級。

proxy.config配置實例:

<serverUrl url ="http://192.168.1.6:6080/arcgis/rest/services"
               matchAll="true"
               dynamicToken="true"
               host="192.168.1.6:6080"
               userName="yangtao"
               password="262728" 
               ></serverUrl>

 

客戶端調用實例:

require(["esri/map", "esri/config", "esri/layers/ArcGISDynamicMapServiceLayer", "extras/TDTRoadLayer", "dojo/domReady!"],
            function (Map, esriConfig, ArcGISDynamicMapServiceLayer, TDTRoadLayer) {
            esriConfig.defaults.io.proxyUrl = "proxy.ashx";
            esriConfig.defaults.io.alwaysUseProxy = true;
            var map = new Map("map", {
                center: [104, 30],
                zoom: 8
            });
            var layer = new TDTRoadLayer();
            map.addLayer(layer);
            var dynamicMapServiceLayer = new ArcGISDynamicMapServiceLayer("http://192.168.1.6:6080/arcgis/rest/services//test/china/MapServer");
            map.addLayer(dynamicMapServiceLayer);
        });

 

 注:

1.對於下載的附件,需要修改proxy,config裏面的參數(url、host、userName、password四個參數);

2.修改index.html中ArcGISDynamicMapServiceLayer服務地址爲正確的可訪問服務地址。

二、arcgis api for JavaScript

<script>
        var map;
        require(["esri/map",
                "src/TDMapLayer",
                "src/TDMapAnnoLayer",
                "src/TDMapImageLayer",
                "esri/layers/FeatureLayer",
                "esri/geometry/Point",
        		"esri/layers/ArcGISDynamicMapServiceLayer",
                "dojo/domReady!"],
            function (Map,
                      TDTLayer,
                      TDTAnnoLayer,
                      TDMapImageLayer,
                      FeatureLayer,
                      Point,ArcGISDynamicMapServiceLayer
            ){
                map = new Map("map", { logo: false });
                var basemap = new TDTLayer();
                //var basemap = new TDMapImageLayer();
                map.addLayer(basemap);
                var annolayer = new TDTAnnoLayer();
                map.addLayer(annolayer);
        		//var test = new ArcGISDynamicMapServiceLayer("http://192.168.4.239:6080/arcgis/rest/services/other/test_tianditu/MapServer");
        		var test = new ArcGISDynamicMapServiceLayer("http://61.50.105.254:6083/arcgis/rest/services/tianjin/WWZ_JZsytle/MapServer?token=VSYowJLPU9Mjm9a-ZIrowjQzt8zVPTCJAYZX-m2XLFdzPMYmJbDF4WPiRtpQEmQK");
        		map.addLayer(test);
                //var pt = new Point(112.206,32.13);
                var pt = new Point(117.262,38.895);
                map.centerAndZoom(pt, 12);
            });
    </script>

三、Openlayers

var token = VSYowJLPU9Mjm9a-ZIrowjQzt8zVPTCJAYZX-m2XLFdzPMYmJbDF4WPiRtpQEmQK;
        //王穩莊道路地圖
        function layer2() {
          //Map.setCenter([117.20254822800007,38.84896601300005], 15);
          Map.createTitleLayer('image',{
            create: true,
            layerType: 'Tile',
            addLayer: true,
            //layerUrl: 'http://61.50.105.254:6083/arcgis/rest/services/tianjin/wangwenzhuagn_dynamic/MapServer'
			layerUrl: 'http://61.50.105.254:6083/arcgis/rest/services/tianjin/WWZ_JZsytle/MapServer',
			params :{
				token:token
			}				
          });
          Map.zoomToExtent([117.20254822800007,38.84896601300005,117.31731513400007,38.930471141000055])
        }