2016-09-14 31 views
1

我有一個需要訪問REST ArcGIS服務的.NET應用程序。該服務是私人服務,需要基於令牌的身份驗證來訪問服務中的數據。由於我是ArcGIS新手,因此我不知道如何生成令牌並在我的.NET應用程序中使用它。如何生成令牌以查詢REST ArcGIS服務?

+1

「arcgis rest token」的第一個google結果:http://server.arcgis.com/en/server/10.3/administer/linux/ acquire-arcgis-tokens.htm – itsme86

+0

該頁面上的網址無法打開。 – dsingh23

+0

我想根據客戶端ID和客戶端密鑰生成令牌。 – dsingh23

回答

0

有關概覽,請參閱https://developers.arcgis.com/authentication/accessing-arcgis-online-services/#using-rest。有兩個選項:

  1. 更方便:使用ArcGIS運行SDK:https://developers.arcgis.com/net/desktop/guide/use-arcgis-token-authentication.htm
  2. 哈德:發佈自己的令牌請求:https://developers.arcgis.com/authentication/accessing-arcgis-online-services/#using-rest(無.NET的樣本,可能是因爲你真的應該使用ArcGIS運行時)

以下是ArcGIS Runtime SDK for .NET示例,該示例使用硬編碼登錄。我上面鏈接的.NET頁面也有一個示例向用戶詢問憑據。

try 
{ 
    var opts = new GenerateTokenOptions(); 
    opts.TokenAuthenticationType = TokenAuthenticationType.ArcGISToken; 

    // generate an ArcGIS token credential with a hard-coded user name and password 
    // (if authentication fails, an ArcGISWebException will be thrown) 
    var cred = await IdentityManager.Current.GenerateCredentialAsync(
           "http://serverapps10.esri.com/arcgis/rest/services/", 
           "user1", 
           "pass.word1", 
           opts); 

    // add the credential to the IdentityManager (will be included in all requests to this portal) 
    IdentityManager.Current.AddCredential(cred); 

    // load a layer based on a secured resource on the portal 
    var layer = new ArcGISDynamicMapServiceLayer(new Uri 
         ("http://serverapps10.esri.com/arcgis/rest/services/GulfLawrenceSecureUser1/MapServer")); 
    await layer.InitializeAsync(); 

    // add the layer to the map and zoom to its extent 
    this.MyMapView.Map.Layers.Add(layer); 
    await this.MyMapView.SetViewAsync(layer.FullExtent); 
} 
catch (ArcGISWebException webExp) 
{ 
    MessageBox.Show("Unable to authenticate with portal: " + webExp.Message); 
} 
catch (Exception exp) 
{ 
    MessageBox.Show("Unable to load secured layer: " + exp.Message); 
} 
1

如果您想要簡單的http請求,您可以創建一個簡單的連接,以遵循以下內容。

首先,你必須知道生成令牌url。例如,如果您的服務器url爲http://myserver/arcgis/rest/services ....,您的生成令牌網址如'http://myserver/arcgis/tokens/generateToken'。 第二操作是準備結果模型生成令牌的結果,它只是像下面

/// <summary> 
/// acgis'e yapılan token isteme isteği sonunda elde edilen json'a ait modeldir 
/// </summary> 
public class ArcgisTokenResponseModel 
{ 
    /// <summary> 
    /// token bilgisi 
    /// </summary> 
    public string token { get; set; } 

    /// <summary> 
    /// token bilgisinin geçerlilik süresi 
    /// </summary> 
    public string expires { get; set; } 

} 

而對於可重用的代碼,我們可以創建類的查詢字符串準備鍵值。 這個類就乾脆像下面

/// <summary> 
/// arcgis yapısına uygun token modelidir 
/// </summary> 
public class TokenModel 
{ 
    /// <summary> 
    /// servisin dönüş tipini belirleyen fieldttır . ör ; json,html 
    /// </summary> 
    public string f { get; set; } 

    /// <summary> 
    /// servise gönderilecek kullanıcı adı bilgisi 
    /// </summary> 
    public string username { get; set; } 

    /// <summary> 
    /// servise gönderilecek olan şifre bilgisidir. 
    /// </summary> 
    public string password { get; set; } 

    /// <summary> 
    /// token bilgisinin hangi ip için geçerli olacağını bildirir 
    /// </summary> 
    public string ip { get; set; } 

    /// <summary> 
    /// token bilgisinin ne kadar süreli olacağını belirtir 
    /// </summary> 
    public int expiration { get; set; } 

    /// <summary> 
    /// servis client bilgisi 
    /// </summary> 
    public string client { get; set; } 

    /// <summary> 
    /// constructure 
    /// </summary> 
    /// <param name="username"></param> 
    /// <param name="password"></param> 
    /// <param name="ip"></param> 
    /// <param name="expiration"></param> 
    /// <param name="f"></param> 
    public TokenModel(string username, string password, string ip, int expiration, string f = "json") 
    { 
     this.expiration = expiration; 
     this.f = f; 
     this.ip = ip; 
     this.password = password; 
     this.username = username; 
    } 

    /// <summary> 
    /// modelin query string halinde dönüşünü sağlar 
    /// </summary> 
    /// <returns></returns> 
    public string GetQueryStringParameter() 
    { 
     return "f=" + this.f + "&username=" + this.username + "&password=" + this.password + "&ip=" + this.ip + "&expiration=" + this.expiration; 
    } 



} 

然後準備生成用戶名和密碼從ArcGIS服務器令牌功能。此功能可喜歡這個

/// <summary> 
    /// mapserver ve feature server için token bilgisi üretir 
    /// </summary> 
    /// <returns></returns> 
    protected string GetToken(string generateTokenUrl,string username,string password) 
    { 
     try 
     { 
      string ipadress = _serverInformationHelper.GetIPAddress(); 
      int exp = 60; 
      if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) 
      { 
       Model.Arcgis.TokenModel tokenModel = new Model.Arcgis.TokenModel(username, password, ipadress, exp); 

       //token bilgisinin alınacağı server url'i 
       string post = tokenModel.GetQueryStringParameter(); 
       WebClient clientToken = new WebClient(); 
       clientToken.Headers.Add("Content-Type: application/x-www-form-urlencoded"); 
       string tokenResult = clientToken.UploadString(generateTokenUrl, post); 
       ArcgisTokenResponseModel resultTokenModel = _seriliazer.Deserialize<ArcgisTokenResponseModel>(tokenResult); 
       if (resultTokenModel != null && !string.IsNullOrEmpty(resultTokenModel.token)) 
        return resultTokenModel.token; 
      } 
      return null; 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 
    } 

畢竟,任何你想要的,你可以使用爲gettoken()function.if我們想要的,我們可以簡化操作。

+0

爲了向服務進行身份驗證,我需要2個令牌:我有一個「令牌」,另一個是我認爲可以使用身份管理器服務生成的「access_token」。只有兩者結合,我才能夠訪問該服務。我仍然無法獲取訪問令牌。 – dsingh23

+0

我認爲你想在arcgis上使用oauth2.0。如果你想要這個,你將會遵循https://developers.arcgis.com/authentication/accessing-arcgis-online-services/。 –

0

正如@spiskula提到你可以按照圖示的方法在https://github.com/Esri/resource-proxy/blob/master/DotNet/proxy.ashx中,特別是getNewTokenIfCredentialsAreSpecified方法。

這是一個非常簡單的例子(.Net 4.5),在沒有SDK的情況下做同樣的事情。用戶需要通過錯誤處理等方式使其更加健壯。

private string GetToken() 
    { 
     var request = (HttpWebRequest)WebRequest.Create("https://www.arcgis.com/sharing/rest/oauth2/token/"); 

     var postData = "client_id=yourclientid"; //required 
     postData += "&client_secret=yourclientsecret"; //required 
     postData += "&grant_type=client_credentials"; //required 
     postData += "&expiration=120"; //optional, default 
     var data = Encoding.ASCII.GetBytes(postData); 

     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = data.Length; 

     using (var stream = request.GetRequestStream()) 
     { 
      stream.Write(data, 0, data.Length); 
     } 

     var response = (HttpWebResponse)request.GetResponse(); 

     var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

     ESRITokenResponse eToken = Newtonsoft.Json.JsonConvert.DeserializeObject<ESRITokenResponse>(responseString); 

     return eToken.access_token; 
    } 

public class ESRITokenResponse 
{ 
    public string access_token { get; set; } 
    public string expires_in { get; set; } 
}