※本記事は、連載記事「.NET SDK アプリ構築」の第 5 回目の記事です。
前回(第4回) の記事では、独自の CSV ファイルを ArcGIS for Developers のクラウド環境(ArcGIS Online) にアップロードし、フィーチャ サービスを作成する手順を紹介しました。今回は、ArcGIS for Developers にアプリケーション情報を登録し、サンプル アプリケーションから ArcGIS Online に公開したサービスにアクセスするためのクライアント ID とシークレット キーの取得を行います。また、取得したクライアント ID とシークレット キーをサンプル アプリケーションに埋め込む手順や、実際にフィーチャ サービスをレイヤーとしてサンプル アプリケーションに追加する手順についてご紹介します。
アプリケーション情報の登録
ArcGIS for Developers にアプリケーション情報を登録することで、アプリケーションから ArcGIS for Developers のクラウド環境(ArcGIS Online) のサービスにアクセスするためのクライアント ID とシークレット キーを取得することができます。
ArcGIS for Developers サイトへログインし、サイトの右上にある [Application] をクリックします。

ページ内の [REGISTER NEW APPLICATION] をクリックします。

[New Application Details] 内の[Title (アプリケーションのタイトル)]、[Tags (検索時に使用されるタグ)]、[Description (アプリケーションの説明 ※オプション)] 項目に任意の値を入力し、[REGISTER NEW APPLICATION] をクリックします。
※画像は一例です。

右側に表示される [Client ID (クライアント ID)] と [Client_Secret (シークレット キー)] を確認します。

※ Client ID と Client Secret はアプリケーションの登録時にユニークな ID として発行されるため、実際の手順で表示されるクライアント ID とシークレット キーは画像の値と異なります。
以上で ArcGIS for Developers へのアプリケーションの登録およびクライアント ID、シークレット キーの取得は完了です。取得したクライアント ID、シークレット キーはこの後の手順で使用するので、ブラウザを開いたままにするか、メモ帳などに記録してください。
この [Client ID] と [Client_Secret] を利用してアプリケーションから ArcGIS Online のセキュアなサービスにアクセスすることを「アプリケーション認証」と呼びます。
アプリケーション認証
アプリケーション認証は、アプリケーションの開発者が、アプリケーションの利用者に ArcGIS Online のセキュアなサービスへのアクセスを許可するために利用します。サービスへのアクセスは事前に取得したクライアント ID とシークレット キーによって認証されるため、アプリケーションの利用者はユーザー名とパスワードを使用したログインなどの認証を行う必要がありません。
クライアント ID とシークレット キーを使用すると、アプリケーション情報を登録した ArcGIS for Developers 開発者アカウントが ArcGIS Online 上に保有するすべてのデータにアクセスすることが可能であるため、クライアント ID とシークレットキーの情報が第 3 者に知られないように十分に注意して管理する必要があります。この連載記事で紹介するサンプル アプリケーションでは、アプリケーション認証の仕組みを紹介するために、クライアント ID とシークレット キーを直接アプリケーションに埋め込んでいますが、セキュリティの要件によっては、クライアント ID とシークレット キーは プロキシ サーバーに配置して代理認証を行うなど、よりセキュアなシステム構成が必要な場合も考えられます。
アプリケーション認証の詳細については、こちらのページの「Application authentication」項目をご参照ください。(英語ページ)
https://developers.arcgis.com/authentication/
アプリケーション認証の実装
1.PortalSecurity クラスの作成
PortalSecurity クラスを作成します。このクラスには、ArcGIS Runtime SDK for .NET の IdentifyManger クラスを利用して、クライアント IDとシークレット キーを用いて ArcGIS Online のサービスへのアクセスを認証するためのメソッドを実装します。
2.メンバー変数の定義
PortalSecurity.cs にアプリケーション ログインで使用する以下の 4 つのメンバー変数を定義します。
・PORTAL_URL
ArcGIS Online REST の URL です。
・CLIENT_ID
アプリケーション ログインに利用するクライアント ID です。(登録したアプリケーションのクライアントIDを指定します)
・CLIENT_SECRET
アプリケーション ログインに利用するシークレット キーです。(登録したアプリケーションのシークレット キーを指定します)
・REDIRECT_URI
認証が成功した場合に、リダイレクトされる URL です。ローカル アプリケーションの場合は、"urn:ietf:wg:oauth:2.0:oob" を指定します。
[PotalSecurity.cs]
//ArcGIS Online REST の URL private const string PORTAL_URL = " https://www.arcgis.com/sharing/rest "; //クライアントID(登録したアプリケーションのクライアントIDを指定します) private const string CLIENT_ID = "************************"; //クライアント シークレット(登録したアプリケーションのクライアントシークレットを指定します) private const string CLIENT_SECRET = "************************"; //リダイレクトURL private const string REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
3.メソッドの実装
PortalSercuriry クラスに ArcGIS for Developers のサービスへアクセスする際に実行されるメソッドとして Challenge メソッドを実装します。Challenge メソッドでは、IdentifyManager クラスを利用して、アクセスするサーバー(ArcGIS Online)の情報の登録や認証を行います。
[PotalSecurity.cs]
public static async Task<Credential> Challenge(CredentialRequestInfo arg) { //サーバー情報を取得 var serverInfo = IdentityManager.Current.FindServerInfo(PORTAL_URL); //サーバ情報が登録されていない場合は新規に作成 if (serverInfo == null) { serverInfo = new ServerInfo() { ServerUri = PORTAL_URL, OAuthClientInfo = new OAuthClientInfo() { ClientId = CLIENT_ID, ClientSecret = CLIENT_SECRET, RedirectUri = REDIRECT_URI, }, //認証情報を指定(アプリケーション ログイン) TokenAuthenticationType = TokenAuthenticationType.OAuthClientCredentials, }; //サーバー情報を登録 IdentityManager.Current.RegisterServer(serverInfo); } //認証情報を生成 return await IdentityManager.Current.GenerateCredentialAsync(PORTAL_URL); }4.ArcGIS Online への認証方法を指定
ArcGIS Online への認証が要求された場合、アプリケーションは、IdentityManager.ChallengeHandler プロパティに指定されているメソッドを実行します。サンプル アプリケーションのコンストラクター内で ChallengeHandler クラスを初期化し、PortalSercuriry クラスの Challenge メソッドを指定します。これにより、Challenge メソッドの戻り値である認証情報を用いて、ArcGIS Online への認証が行われます。
[MainWindows.xaml.cs]
/// <summary> /// コンストラクタ /// </summary> public MainWindow() { InitializeComponent(); //ArcGIS Online への認証方法の指定 IdentityManager.Current.ChallengeHandler = new ChallengeHandler(PortalSecurity.Challenge); //住所検索用のジオコーディング タスクを初期化 onlineLocatorTask = new OnlineLocatorTask(new Uri(WORLD_GEOCODE_SERVICE_URL)); }フィーチャ レイヤーの追加
最後に、第 4 回で公開したフィーチャ サービスにアプリケーションからアクセスし、レイヤーとして表示します。アプリケーションからフィーチャ サービスにアクセスするには、フィーチャ サービスのREST エンドポイントの URL を使用します。URL の確認方法は第 4 回の記事を参照してください。
MainWindows.xaml 内の Map クラスにフィーチャ レイヤーを追加します。レイヤーは、記述した順に重なって表示されます。今回追加するフィーチャ レイヤーはポイント レイヤーであるため、ベースマップ レイヤーの上に表示されるように追加します。フィーチャ サービスの REST エンド ポイントの URL は FeatureLayer クラスの FeatureTable プロパティから取得できる ServiceFeatureTable クラスの ServiceUri プロパティに指定します。
[MainWindow.xaml]
<!--マップビュー--> <esri:MapView Grid.Column="1" x:Name="mainMapView" Loaded="mainMapView_Loaded"> <!--マップ--> <esri:Map InitialViewpoint="15539982.3500528, 4257132.45180773, 15545386.0541707, 4262306.70411199"> <!--背景地図レイヤ--> <esri:ArcGISTiledMapServiceLayer ID="BaseMap" ServiceUri=" http://services.arcgisonline.com/arcgis/rest/services/World_Topo_Map/MapServer " /> <!--物件フィーチャレイヤ--> <esri:FeatureLayer ID="BuildingLayer"> <esri:FeatureLayer.FeatureTable> <esri:ServiceFeatureTable OutFields="*" ServiceUri="{StaticResource BuildingLayerURL}" /> </esri:FeatureLayer.FeatureTable> </esri:FeatureLayer> <!--住所検索結果表示用グラフィックスレイヤ--> <esri:GraphicsLayer ID="GeocodingResultLayer" Renderer="{StaticResource redMarkerRenderer}" /> </esri:Map> </esri:MapView>※Github に公開しているサンプル アプリケーションのソリューションでは、各ステップのプロジェクトの ServiceUri プロパティを一括で指定できるように、ServiceUri プロパティは、CommonResources.xaml に記載された値を参照しています。GitHub 上のソリューションを利用する場合は、フィーチャ サービスの REST エンドポイントの URL は CommonResources.xaml に指定してください(「Step 4 で作成したサービスのURL」の箇所を実際の URL と置き換えます)。
[CommonResources.xaml]
<ResourceDictionary xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation " xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " xmlns:system="clr-namespace:System;assembly=mscorlib"> <!--物件レイヤサービスのURL(Step 4 で作成したサービスのURLを指定します)--> <system:String x:Key="BuildingLayerURL">Step 4 で作成したサービスのURL</system:String> </ResourceDictionary>
アプリケーションを起動し、フィーチャ サービスが地図上に表示されることを確認します。

本記事では、アプリケーション認証の実装方法と公開したフィーチャ サービスをアプリケーションに追加する手順を紹介しました。第 6 回の記事では、今回の記事で追加したフィーチャ サービスの属性情報をマップチップとして表示する方法をご紹介します。
関連リンク
ArcGIS Runtime SDK for .NET サンプル アプリ構築:
ESRIジャパン Web サイト:
Esri 社(米国) Web サイト: