Web API を呼び出すデスクトップ アプリ:運用環境に移行する

この記事では、Web API を呼び出すデスクトップ アプリを運用環境に移行する方法について説明します。

デスクトップ アプリケーションでのエラー処理

別のフローでは、コード スニペットに示されているように、サイレント フローのエラーを処理する方法を説明しました。 また、増分同意や条件付きアクセスの場合などに、対話が必要となるケースがあることも説明しました。

注意

複数のリソースにおける同意の事前取得は、Microsoft ID プラットフォームでは機能しますが、Azure Active Directory (Azure AD) B2C では機能しません。 Azure AD B2C では、管理者による承認のみがサポートされており、ユーザーによる承認はサポートされていません。

Microsoft ID プラットフォームでは、複数のリソースのトークンを一度に取得することはできません。 scopes パラメーターには、1 つリソースのみのスコープを含めることができます。 extraScopesToConsent パラメーターを使用して、ユーザーが複数のリソースに事前に同意するようにできます。

たとえば、2 つのリソースがあり、それぞれに 2 つのスコープがあるとします。

  • https://mytenant.onmicrosoft.com/customerapi のスコープは customer.readcustomer.write です
  • https://mytenant.onmicrosoft.com/vendorapi のスコープは vendor.readvendor.write です

この例では、extraScopesToConsent パラメーターを持つ .WithExtraScopesToConsent 修飾子を使用します。

次に例を示します。

MSAL.NET の場合

string[] scopesForCustomerApi = new string[]
{
  "https://mytenant.onmicrosoft.com/customerapi/customer.read",
  "https://mytenant.onmicrosoft.com/customerapi/customer.write"
};
string[] scopesForVendorApi = new string[]
{
 "https://mytenant.onmicrosoft.com/vendorapi/vendor.read",
 "https://mytenant.onmicrosoft.com/vendorapi/vendor.write"
};

var accounts = await app.GetAccountsAsync();
var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
                     .WithAccount(accounts.FirstOrDefault())
                     .WithExtraScopesToConsent(scopesForVendorApi)
                     .ExecuteAsync();

iOS および macOS 用の MSAL の場合

Objective-C:

NSArray *scopesForCustomerApi = @[@"https://mytenant.onmicrosoft.com/customerapi/customer.read",
                                @"https://mytenant.onmicrosoft.com/customerapi/customer.write"];

NSArray *scopesForVendorApi = @[@"https://mytenant.onmicrosoft.com/vendorapi/vendor.read",
                              @"https://mytenant.onmicrosoft.com/vendorapi/vendor.write"]

MSALInteractiveTokenParameters *interactiveParams = [[MSALInteractiveTokenParameters alloc] initWithScopes:scopesForCustomerApi webviewParameters:[MSALWebviewParameters new]];
interactiveParams.extraScopesToConsent = scopesForVendorApi;
[application acquireTokenWithParameters:interactiveParams completionBlock:^(MSALResult *result, NSError *error) { /* handle result */ }];

Swift:

let scopesForCustomerApi = ["https://mytenant.onmicrosoft.com/customerapi/customer.read",
                            "https://mytenant.onmicrosoft.com/customerapi/customer.write"]

let scopesForVendorApi = ["https://mytenant.onmicrosoft.com/vendorapi/vendor.read",
                          "https://mytenant.onmicrosoft.com/vendorapi/vendor.write"]

let interactiveParameters = MSALInteractiveTokenParameters(scopes: scopesForCustomerApi, webviewParameters: MSALWebviewParameters())
interactiveParameters.extraScopesToConsent = scopesForVendorApi
application.acquireToken(with: interactiveParameters, completionBlock: { (result, error) in /* handle result */ })

この呼び出しでは、最初の Web API のアクセス トークンを取得します。

2 番目の Web API を呼び出す場合は、AcquireTokenSilent API を呼び出します。

AcquireTokenSilent(scopesForVendorApi, accounts.FirstOrDefault()).ExecuteAsync();

Microsoft 個人アカウントではアプリを実行するたびに再同意が必要

Microsoft 個人アカウントのユーザーの場合、承認のためのネイティブ クライアント (デスクトップまたはモバイル アプリ) の呼び出しごとに同意のプロンプトが再表示されますが、これは意図的な動作です。 ネイティブ クライアント ID は本質的に安全ではありません。これは、機密性の高いクライアント アプリケーション ID とは異なります。 機密性の高いクライアント アプリケーションは、その ID を証明するために、Microsoft ID プラットフォームとシークレットを交換します。 Microsoft ID プラットフォームは、アプリケーションが承認されるたびにユーザーに同意を求めることで、コンシューマー サービスにおけるこのような非安全性を軽減することを選択しました。

ログの有効化

デバッグと認証エラーのトラブルシューティングのシナリオを支援するために、Microsoft Authentication Library は組み込みのログ記録をサポートしています。 各ライブラリでのログ記録については、次の記事で説明されています。

データ収集に関する推奨事項を次に示します。

  • ユーザーは、問題があるときに支援を求めることがあります。 ログをキャプチャして一時的に保存することをお勧めします。 ユーザーがログをアップロードできる場所を指定します。 MSAL には、認証に関する詳細情報をキャプチャするログの拡張機能があります。

  • テレメトリが利用できる場合は、MSAL を介して有効にして、ユーザーがアプリにサインインしている方法についてデータを収集します。

統合の検証

Microsoft ID プラットフォームの統合チェックリストに従って、統合をテストします。

回復性のための構築

アプリの回復性を向上させる方法について説明します。 詳細については、「開発する認証と認可のアプリケーションの回復性を向上させる」を参照してください。

次のステップ

追加のサンプルを試すには、デスクトップのパブリック クライアント アプリケーションに関する記事を参照してください。