AD FS 2016 以降を使用して OAuth 機密クライアントを使用するサーバー側アプリケーションを構築する
Active Directory フェデレーション サービス (AD FS) 2016 以降では、Web サーバー上で実行されるアプリやサービスなど、独自のシークレットを保持できるクライアントがサポートされています。 このようなクライアントは "機密クライアント" と呼ばれます。
この記事では、Web サーバーで実行される Web アプリケーションについて説明します。 このアプリケーションは、AD FS に対する機密クライアントとして機能します。
前提条件
次のリソースが必要です。
GitHub クライアント ツール。
Windows Server 2016 Technical Preview 4 以降の AD FS。 (この記事では、AD FS がインストールされていることを前提とします)。
Visual Studio 2013 以降
アプリケーション グループを作成する
AD FS 2016 以降でアプリケーション グループを作成するには:
[AD FS の管理] で、[アプリケーション グループ] を右クリックします。 次に、[アプリケーション グループの追加] を選びます。
アプリケーション グループの追加ウィザードで、次のようにします。
- [名前] に「ADFSOAUTHCC」と入力します。
- [クライアント サーバー アプリケーション] で、[Web API にアクセスするサーバー アプリケーション] テンプレートを選びます。
- [次へ] を選択します。
[クライアント識別子] の値をコピーします。 これは後ほどアプリケーションの web.config ファイルで使います。 これは
ida:ClientId
の値です。[リダイレクト URI] に「https://localhost:44323」と入力します。 [追加] を選んでから [次へ] を選びます。
[アプリケーションの資格情報の構成] ページで、次のようにします。
- [共有シークレットを生成する] を選びます。
- シークレットをコピーします。 このシークレットは後ほどアプリケーションの web.config ファイルで使います。 これは
ida:ClientSecret
の値です。 - [次へ] を選択します。
[Web API の構成] ページで、次のようにします。
- [識別子] に「https://contoso.com/WebApp」と入力します。 この値は後ほどアプリケーションの web.config ファイルで使います。 これは
ida:GraphResourceId
の値です。 - [追加] を選択します。
- [次へ] を選択します。
- [識別子] に「https://contoso.com/WebApp」と入力します。 この値は後ほどアプリケーションの web.config ファイルで使います。 これは
[アクセス制御ポリシーの適用] ページで、[すべてのユーザーを許可] を選びます。 [次へ] を選択します。
[アプリケーションのアクセス許可の構成] ページで、openid と user_impersonation が選ばれていることを確認します。 [次へ] を選択します。
[概要] ページで、[次へ] を選びます。
[完了] ページで [閉じる] を選びます。
データベースをアップグレードする
この記事は、Visual Studio 2015 に基づいて書かれています。 この例を Visual Studio 2015 で動くようにするには、このセクションの手順に従ってデータベース ファイルをアップグレードします。
このセクションでは、サンプル Web API をダウンロードし、Visual Studio 2015 でデータベースをアップグレードする方法について説明します。 Azure Active Directory サンプルを使います。
サンプル プロジェクトをダウンロードするには、Git Bash で次のコマンドを入力します。
git clone https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-oauth2-useridentity.git
データベース ファイルをアップグレードするには:
Visual Studio でプロジェクトを開きます。 表示されるウィンドウのメッセージでは、アプリに SQL Server 2012 Express が必要であることが説明されています。 SQL Server 2012 Express がない場合は、データベースをアップグレードする必要があります。 [OK] を選択します。
•
ウィンドウの上部にある [ビルド]>[ソリューションのビルド] を選んで、アプリケーションをコンパイルします。 すべての NuGet パッケージが復元されます。
ウィンドウの上部で [表示]>[サーバー エクスプローラー] を選びます。 開いたペインの [データ接続] で [DefaultConnection] を右クリックし、[接続の変更] を選びます。
[接続の変更] ウィンドウで、[データベース ファイル名 (新規または既存)] の [参照] を選びます。 「<パス>\<ファイル名>.mdf」と入力します。 次に、ダイアログ ボックスで [はい] を選びます。
[接続の変更] ダイアログ ボックスで、[詳細設定] を選びます。
•
[詳細プロパティ] ダイアログ ボックスの [データ ソース] で、(LocalDb\v11.0) を (LocalDB)\MSSQLLocalDB に変更します。
[OK]>[OK] の順に選択します。 次に、[はい] を選んでデータベースをアップグレードします。
プロセスが完了したら、右側の [接続文字列] フィールドの値をコピーします。
web.config ファイルを開き、
connectionString
の値を前にコピーした値に置き換えます。 web.config ファイルを保存します。注意
前の手順は、新しい接続文字列を取得するために必要です。 そうしないと、この記事で後ほど
Update-Database
を実行したときにエラーが発生します。•
Visual Studio ウィンドウの上部で、[表示]>[その他のウィンドウ]>[パッケージ マネージャー コンソール] を選びます。
[パッケージ マネージャー コンソール] ペインで、「
Enable-Migrations
」と入力します。注意
"Enable-Migrations はコマンドレットとして認識されません" というエラーが表示される場合は、「Install-Package EntityFramework」と入力してエンティティ フレームワークを更新します。
「
Add-Migration <AnyNameHere>
」と入力します。•
「
Update-Database
」と入力します。
Web API を変更する
Visual Studio でサンプル Web API を変更するには:
Visual Studio でサンプルを開きます。
web.config ファイルを開きます。 「アプリケーション グループを作成する」の手順でコピーした値を使って、次の設定を変更 します。
ida:ClientId
: クライアント ID を入力します。ida:ClientSecret
: クライアント シークレットを入力します。ida:GraphResourceId
: グラフ リソース ID を入力します。
App_Start で、Startup.Auth.cs ファイルを開きます。 次の変更を行います。
次の行をコメント アウトします。
//private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; //private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"]; //public static readonly string Authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
削除した行の代わりに、次の行を追加します。
public static readonly string Authority = "https://<your_fsname>/adfs";
ここで、
<your_fsname>
を自分のフェデレーション サービス URL の DNS の部分に置き換えます。 たとえば、「adfs.contoso.com」と入力します。
UserProfileController.cs ファイルを開きます。 次の変更を行います。
次の行をコメントアウトします。
//authContext = new AuthenticationContext(Startup.Authority, new TokenDbCache(userObjectID));
両方の出現箇所を次のコードに置き換えます。
authContext = new AuthenticationContext(Startup.Authority, false, new TokenDbCache(userObjectID));
•
次の行をコメントアウトします。
//authContext = new AuthenticationContext(Startup.Authority);
両方の出現箇所を次のコードに置き換えます。
authContext = new AuthenticationContext(Startup.Authority, false);
次の行のすべてのインスタンスをコメントアウトします。
Uri redirectUri = new Uri(Request.Url.GetLeftPart(UriPartial.Authority).ToString() + "/OAuth");
すべての出現箇所を次のコードに置き換えます。
Uri redirectUri = new Uri(Request.Url.GetLeftPart(UriPartial.Authority).ToString());
ソリューションをテストする
機密クライアント ソリューションをテストするには:
Visual Studio ウィンドウの上部で、[Internet Explorer] が選ばれていることを確認します。 次に、緑色の矢印を選びます。
開いた ASP.NET ページで次のようにします。
- 右上隅にある [登録] を選びます。
- ユーザー名とパスワードを入力します。
- [登録] を選んで、SQL データベースにローカル アカウントを作成します。
"Hello abby@contoso.com!" というメッセージに注意してください。 [プロファイル] を選択します。
新しいページに、サインインを求めるメッセージが表示されます。 [こちら] を選びます。
AD FS へのサインインを求めるメッセージが表示されます。
次の手順
AD FS の開発について確認します。