2016-09-14 11 views
1

У меня есть приложение .NET, которому необходимо получить доступ к службе REST ArcGIS. Эта услуга является частной и требует аутентификации на основе токенов для доступа к данным внутри службы. Поскольку я новичок в ArcGIS, я не знаю, как сгенерировать токен и использовать его в своем приложении .NET.Как создать токен для запроса службы REST ArcGIS?

+1

Первый Google результат для «отдыха маркер ArcGIS»: http://server.arcgis.com/en/server/10.3/administer/linux/ acquiring-arcgis-tokens.htm – itsme86

+0

URL-адрес этой страницы не открывается для меня. – dsingh23

+0

Я хочу создать токен, основанный на идентификаторе клиента и секретности клиента. – 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. Harder: разместить свой собственный маркер запроса: https://developers.arcgis.com/authentication/accessing-arcgis-online-services/#using-rest (нет образцов .NET, вероятно, потому, что вы действительно должны использовать ArcGIS Runtime)

Вот пример SDK для ArcGIS для .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

Я думаю, что вы хотите использовать oauth2.0 на arcgis. если вы хотите этого, вы будете следовать https://developers.arcgis.com/authentication/accessing-arcgis-online-services/. –

0

Как @spiskula упоминалось вы могли бы следовать метод, показанный в https://github.com/Esri/resource-proxy/blob/master/DotNet/proxy.ashx, в частности метод getNewTokenIfCredentialsAreSpecified.

Настоящий упрощенный пример (pre .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; } 
}