我有一個需要訪問REST ArcGIS服務的.NET應用程序。該服務是私人服務,需要基於令牌的身份驗證來訪問服務中的數據。由於我是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
- 哈德:發佈自己的令牌請求: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);
}
如果您想要簡單的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
我認爲你想在arcgis上使用oauth2.0。如果你想要這個,你將會遵循https://developers.arcgis.com/authentication/accessing-arcgis-online-services/。 –
正如@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; }
}
- 1. REST API中的令牌生成WCS
- 2. 可以使用Azure搜索服務生成所有查詢令牌嗎?
- 3. 如何生成oauth令牌?
- 4. 使用刷新令牌生成訪問令牌的查詢
- 5. 從Golang REST API生成Amazon S3令牌
- 6. 如何使用街道地址通過ajax查詢ARCGIS REST服務
- 7. 如何爲REST服務生成WADL
- 8. 如何從REST服務生成實體?
- 9. 如何從WAC Office服務器生成WOPI訪問令牌
- 10. 如何藉助密鑰生成令牌?
- 11. 驗證SWT令牌REST WCF服務
- 12. 生成LTPA令牌?
- 13. Xpages使用auth令牌調用Rest服務令牌
- 14. 令牌生成
- 15. CSRF令牌生成
- 16. 如何生成用於Firebase REST API的JWT令牌?
- 17. REST服務如何使用令牌進行身份驗證
- 18. 在作曲家如何使用訪問令牌REST服務器
- 19. Flask令牌生成
- 20. 如何查找Azure API App的IP地址以生成SAS令牌?
- 21. 如何使用dojo/store/JsonRest工作ArcGIS Rest服務
- 22. 如何在Openlayers中加載AGRC ArcGIS REST瓷磚服務?
- 23. 如何生成令牌,這是多個令牌的泛化?
- 24. 將SQL令牌生成器更改爲Java令牌生成器
- 25. 如何生成SQL查詢
- 26. ASP.NET OAuth:如何生成訪問令牌?
- 27. 我如何從android生成JWT令牌
- 28. 如何爲LinkedIn生成訪問令牌?
- 29. 如何生成Facebook訪問令牌?
- 30. 如何在Express中生成CSRF令牌?
「arcgis rest token」的第一個google結果:http://server.arcgis.com/en/server/10.3/administer/linux/ acquire-arcgis-tokens.htm – itsme86
該頁面上的網址無法打開。 – dsingh23
我想根據客戶端ID和客戶端密鑰生成令牌。 – dsingh23