У меня есть приложение .NET, которому необходимо получить доступ к службе REST ArcGIS. Эта услуга является частной и требует аутентификации на основе токенов для доступа к данным внутри службы. Поскольку я новичок в ArcGIS, я не знаю, как сгенерировать токен и использовать его в своем приложении .NET.Как создать токен для запроса службы REST ArcGIS?
ответ
См. https://developers.arcgis.com/authentication/accessing-arcgis-online-services/#using-rest для обзора. Есть два варианта:
- проще: использовать ArcGIS SDK среды выполнения: https://developers.arcgis.com/net/desktop/guide/use-arcgis-token-authentication.htm
- 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);
}
Если вы хотите простые 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 мы хотим, мы можем упростить операции.
Удачи
Для аутентификации службы мне нужно 2 токена: один «токен» у меня есть, а другой - «access_token», который, как я думаю, может быть сгенерирован с использованием службы диспетчера удостоверений. Только с их сочетанием я получаю доступ к службе. Я все еще не могу получить токен доступа. – dsingh23
Я думаю, что вы хотите использовать oauth2.0 на arcgis. если вы хотите этого, вы будете следовать https://developers.arcgis.com/authentication/accessing-arcgis-online-services/. –
Посмотрите, как маркеры, полученные в прокси Esri в: https://developers.arcgis.com/authentication/working-with-proxies/
И в частности: https://github.com/Esri/resource-proxy/tree/master/DotNet https://github.com/Esri/resource-proxy/blob/master/DotNet/proxy.ashx
Как @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; }
}
Первый Google результат для «отдыха маркер ArcGIS»: http://server.arcgis.com/en/server/10.3/administer/linux/ acquiring-arcgis-tokens.htm – itsme86
URL-адрес этой страницы не открывается для меня. – dsingh23
Я хочу создать токен, основанный на идентификаторе клиента и секретности клиента. – dsingh23