AD FS 2016 以降の OAuth パブリッククライアントを使用してネイティブクライアントアプリケーションを構築するBuild a native client application using OAuth public clients with AD FS 2016 or later

概要Overview

この記事では、AD FS 2016 以降で保護されている Web API と対話するネイティブアプリケーションを構築する方法について説明します。This article shows how to build a native application that interacts with a Web API protected by AD FS 2016 or later.

  1. .Net TodoListClient WPF アプリケーションは、Active Directory 認証ライブラリ (ADAL) を使用して Azure Active Directory (Azure AD) から OAuth 2.0 プロトコルを介して JWT アクセストークンを取得します。The .Net TodoListClient WPF application uses the Active Directory Authentication Library (ADAL) to obtain a JWT access token from Azure Active Directory (Azure AD) through the OAuth 2.0 protocol
  2. アクセストークンは、TodoListService web API の/todolist エンドポイントを呼び出すときにユーザーを認証するためのベアラートークンとして使用されます。The access token is used as a bearer token to authenticate the user when calling the /todolist endpoint of the TodoListService web API. ここでは Azure AD のアプリケーションの例を使用し、AD FS 2016 以降に変更します。We will be using the application example for Azure AD here and then modify it for AD FS 2016 or later.

アプリケーションの overivew

前提条件Pre-requisites

このドキュメントを完了する前に必要な前提条件の一覧を次に示します。The following are a list of pre-requisites that are required prior to completing this document. このドキュメントでは、AD FS がインストールされ、AD FS ファームが作成されていることを前提としています。This document assumes that AD FS has been installed and an AD FS farm has been created.

  • GitHub クライアントツールGitHub client tools
  • Windows Server 2016 以降の AD FSAD FS in Windows Server 2016 or later
  • Visual Studio 2013 以降Visual Studio 2013 or later

サンプルチュートリアルの作成Creating the sample walkthrough

AD FS でアプリケーショングループを作成します。Create the application group in AD FS

  1. AD FS 管理] で、[ アプリケーショングループ ] を右クリックし、[ アプリケーショングループの追加] を選択します。In AD FS Management, right-click on Application Groups and select Add Application Group.

  2. アプリケーショングループウィザードで、[名前] に任意の名前 (例: NativeToDoListAppGroup) を入力します。On the Application Group Wizard, for the name enter any name you prefer, e.g. NativeToDoListAppGroup. WEB API テンプレートにアクセスするネイティブアプリケーション を選択します。Select the Native application accessing a web API template . [次へ] をクリックします。Click Next. アプリケーショングループの追加Add application group

  3. [ ネイティブアプリケーション ] ページで、AD FS によって生成された識別子を確認します。On the Native application page, note the identifier generated by AD FS. これは、AD FS がパブリッククライアントアプリを認識する id です。This is the id with which AD FS will recognize the public client app. [ クライアント識別子 の値をコピーします。Copy the Client Identifier value. この値は、アプリケーションコードで ida: ClientId の値として後で使用されます。It will be used later as the value for ida:ClientId in the application code. 必要に応じて、ここで任意のカスタム識別子を指定できます。If you wish you can give any custom identifier here. リダイレクト URI は任意の値です。たとえば、 https://ToDoListClient  ネイティブアプリを配置します。The redirect URI is any arbitrary value, example, put https://ToDoListClient Native app

  4. [ WEB api の構成 ] ページで、web api の識別子の値を設定します。On the Configure Web API page, set the identifier value for the Web API. この例では、これは Web アプリが実行されていると考えられる SSL URL の値にする必要があります。For this example, this should be the value of the SSL URL where the Web App is supposed to be running. この値を取得するには、ソリューション内の TooListServer プロジェクトのプロパティをクリックします。You can get this value by clicking on the properties of the TooListServer project in the solution. これは、ネイティブクライアントアプリケーションの App.config ファイルの todo: TodoListResourceId 値として、また todo: TodoListBaseAddress として後で使用されます。This will be later used as the todo:TodoListResourceId value in App.config file of the native client application and also as the todo:TodoListBaseAddress. Web APIWeb API

  5. [ Access Control ポリシーの適用 ] を実行し、既定値を設定した状態で アプリケーションのアクセス許可を構成 します。Go through the Apply Access Control Policy and Configure Application Permissions with the default values in place. [概要] ページは次のようになります。The summary page should look like below. まとめSummary

[次へ] をクリックし、ウィザードを完了します。Click next and then complete the wizard.

発行された要求の一覧に NameIdentifier 要求を追加します。Add the NameIdentifier claim to the list of claims issued

デモアプリケーションでは、さまざまな場所で NameIdentifier claim の値を使用します。The demo application uses the value in NameIdentifier claim at various places. Azure AD とは異なり、AD FS は既定で NameIdentifier 要求を発行しません。Unlike Azure AD, AD FS does not issue a NameIdentifier claim by default. そのため、NameIdentifier 要求を発行する要求規則を追加して、アプリケーションが正しい値を使用できるようにする必要があります。Therefore, we need to add a claim rule to issue the NameIdentifier claim so that the application can use the correct value. この例では、指定されたユーザー名が、トークン内のユーザーの NameIdentifier 値として発行されます。In this example, the given name of the user is issued as the NameIdentifier value for the user in the token. 要求規則を構成するには、先ほど作成したアプリケーショングループを開き、Web API をダブルクリックします。To configure the claim rule, open the application group just created, and double click on the Web API. [発行変換規則] タブを選択し、[規則の追加] ボタンをクリックします。Select the Issuance Transform Rules tab and then click on Add Rule button. 要求規則の種類で、[カスタム要求規則] を選択し、次のように要求規則を追加します。In the type of claim rule, choose Custom claim rule and then add the claim rule as shown below.

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"), query = ";givenName;{0}", param = c.Value);

NameIdentifier 要求規則

アプリケーション コードの変更Modify the application code

このセクションでは、サンプル Web API をダウンロードし、Visual Studio で変更する方法について説明します。This section discusses how to download the sample Web API and modify it in Visual Studio. ここに記載されている Azure AD サンプルを使用します。We will be using the Azure AD sample that is here.

サンプルプロジェクトをダウンロードするには、Git Bash を使用し、次のように入力します。To download the sample project, use Git Bash and type the following:

git clone https://github.com/Azure-Samples/active-directory-dotnet-native-desktop

ToDoListClient の変更Modify ToDoListClient

ソリューション内のこのプロジェクトは、ネイティブクライアントアプリケーションを表します。This project in the solution represents the native client application. クライアントアプリケーションが次のことを認識していることを確認する必要があります。We need to make sure that the client application knows:

  1. 必要に応じてユーザーを認証するには、どこに移動すればよいですか。Where to go to get the user authenticated when required?
  2. クライアントが認証機関 (AD FS) に提供する必要がある ID は何ですか。What is the ID that client needs to provide to the authenticating authority (AD FS)?
  3. アクセストークンを要求しているリソースの ID は何ですか。What is the ID of the resource that we are asking the access token for?
  4. Web API のベースアドレスとは何ですか。What is the base address of the Web API?

ネイティブクライアントアプリケーションに上記の情報を取得するには、次のコード変更が必要です。The following code changes are needed in order to get the above information to the native client application.

App.configApp.config

  • AD FS サービスを表す値を持つキー ida: Authority を追加します。Add the key ida:Authority with the value depicting the AD FS service. たとえば、https://fs.contoso.com/adfs/ のように指定します。For example, https://fs.contoso.com/adfs/

  • AD FS でのアプリケーショングループの作成時に、ネイティブアプリケーション ページで [クライアント識別子] の値を使用して ida: ClientId キーを変更します。Modify ida:ClientId key with the value from Client Identifier in the Native Application page during the Application Group creation in AD FS. たとえば、3f07368b-6efd-4f50-a330-d93853f4c855 のようになります。For example, 3f07368b-6efd-4f50-a330-d93853f4c855

  • AD FS でアプリケーショングループを作成するときに、[ WEB API の構成] ページの [識別子] の値を使用して todo: todo: TodoListResourceId を変更します。Modify the todo:todo:TodoListResourceId with the value from Identifier in the Configure Web API page during the Application Group creation in AD FS. たとえば、https://localhost:44321/ のように指定します。For example, https://localhost:44321/

  • AD FS でアプリケーショングループを作成するときに、[ WEB API の構成] ページの [識別子] の値を使用して todo: TodoListBaseAddress を変更します。Modify the todo:TodoListBaseAddress with the value from Identifier in the Configure Web API page during the Application Group creation in AD FS. たとえば、https://localhost:44321/ のように指定します。For example, https://localhost:44321/

  • AD FS でのアプリケーショングループの作成時に、ネイティブアプリケーション ページの [リダイレクト uri ] の値を使用して ida: redirecturi の値を設定します。Set the value of ida:RedirectUri with the value from Redirect URI in the Native application page during the Application Group creation in AD FS. たとえば、https://ToDoListClient のように指定します。For example, https://ToDoListClient

  • 読みやすくするために、 ida: Tenantida: AADInstance のキーを削除/コメントすることができます。For ease of reading you can remove / comment the key for ida:Tenant and ida:AADInstance.

    アプリの構成

MainWindow.xaml.csMainWindow.xaml.cs

  • 次のように aadInstance の行をコメント化します。Comment the line for aadInstance as below

    // private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];

  • 次のように authority の値を追加します。Add the value for authority as below

    private static string authority = ConfigurationManager.AppSettings["ida:Authority"];

  • AadInstance とテナントから 機関 の値を作成するための行を削除します。Delete the line for creating the authority value from aadInstance and tenant

    private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

  • 関数 mainwindow.xaml で、authcontext のインスタンス化をに変更します。In the function MainWindow, change the authContext instantiation to

    authContext = new AuthenticationContext(authority,false);

    ADAL は、authority AD FS の検証をサポートしていないため、validateAuthority パラメーターに false 値フラグを渡す必要があります。ADAL does not support validating AD FS as authority and therefore we have to pass a false value flag for validateAuthority parameter.

    メイン ウィンドウ

TodoListService の変更Modify TodoListService

このプロジェクトには、Web.config と Startup.Auth.cs という2つのファイルが必要です。Two files need changes in this project – Web.config and Startup.Auth.cs. パラメーターの正しい値を取得するには、Web.Config の変更が必要です。Web.Config changes are required to get the correct values of the parameters. Azure AD ではなく AD FS に対して認証するように WebAPI を設定するには、Startup.Auth.cs の変更が必要です。Startup.Auth.cs changes are required to set the WebAPI to authenticate against AD FS rather than Azure AD.

Web.configWeb.config

  • 必要ではないため、キー ida: テナント にコメントを付けますComment the key ida:Tenant as we don't need it
  • フェデレーションサービスの FQDN (例:) を示す値を持つ ida: Authority のキーを追加します。 https://fs.contoso.com/adfs/Add the key for ida:Authority with value indicating the FQDN of the federation service, example, https://fs.contoso.com/adfs/
  • キー ida: [アプリケーショングループの追加] の [ Web api の構成 ] ページで指定した web api 識別子の値を AD FS に変更します。Modify key ida:Audience with the value of the Web API identifier that you specified in the Configure Web API page during Add Application Group in AD FS.
  • AD FS サービスのフェデレーションメタデータ URL に対応する値を持つキー ida: AdfsMetadataEndpoint を追加します。次に例を示します。 https://fs.contoso.com/federationmetadata/2007-06/federationmetadata.xmlAdd key ida:AdfsMetadataEndpoint with value corresponding to the federation metadata URL of the AD FS service, for ex: https://fs.contoso.com/federationmetadata/2007-06/federationmetadata.xml

Web 構成

Startup.Auth.csStartup.Auth.cs

ConfigureAuth 関数を次のように変更します。Modify the ConfigureAuth function as below

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseActiveDirectoryFederationServicesBearerAuthentication(
            new ActiveDirectoryFederationServicesBearerAuthenticationOptions
            {
                MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                TokenValidationParameters = new TokenValidationParameters()
                {
                    SaveSigninToken = true,
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                }

            });
    }

基本的には、AD FS を使用し、AD FS メタデータに関する情報をさらに提供するように認証を構成し、トークンを検証するために、Web API によって想定される値を対象ユーザー要求にする必要があります。Essentially, we are configuring the authentication to use AD FS and further provide information about the AD FS metadata, and to validate the token, the audience claim should be the value expected by the Web API. アプリケーションの実行Running the application

  1. ソリューション DotNet で、右クリックし、[プロパティ] にアクセスします。On the solution NativeClient-DotNet, right click and go to properties. 次に示すように、スタートアッププロジェクトを複数のスタートアッププロジェクトに変更し、TodoListClient と TodoListService の両方を Start に設定します。Change the Startup Project as shown below to Multiple Startup projects and set both TodoListClient and TodoListService to Start. ソリューションのプロパティSolution properties

  2. F5 キーを押すか、メニューバーの [デバッグ > 続行] を選択します。Press F5 button or select Debug > Continue in the menu bar. これにより、ネイティブアプリケーションと WebAPI の両方が起動されます。This will launch both the native application and the WebAPI. ネイティブアプリケーションの [サインイン] ボタンをクリックすると、AD AL からの対話型ログオンがポップアップ表示され、AD FS サービスにリダイレクトされます。Click on Sign-in button on the native application and it will pop-up an interactive logon from AD AL and redirect to your AD FS service. 有効なユーザーの資格情報を入力してください。Enter the credentials of a valid user. [サインイン] ダイアログボックスを示すスクリーンショット。Screenshot showing the sign in dialog box.

この手順では、ネイティブアプリケーションが AD FS にリダイレクトされ、Web API の ID トークンとアクセストークンが返されます。In this step, the native application redirected to AD FS and got an ID token and an access token for the Web API

  1. テキストボックスに to do アイテムを入力し、[アイテムの追加] をクリックします。Enter a to do item in the text box and click on Add item. この手順では、アプリケーションが Web API に到達して to do 項目を追加します。そのために、AD FS から取得した WebAPI にアクセストークンを提示します。In this step, the application reaches out to the Web API to add the to do item, and in order to do so, presents the access token to the WebAPI obtained from AD FS. Web API は、対象ユーザーの値と照合して、トークンが想定されていることを確認し、フェデレーションメタデータからの情報を使用してトークンの署名を検証します。The Web API matches the audience value to make sure the token is intended for it and verifies the token signature using the info from the federation metadata.

サインイン

次の手順Next Steps

AD FS の開発AD FS Development