MSAL.NET シナリオ

はじめに

.NET認証ライブラリでは、Web API を保護し、保護された Web API のトークンを取得するシナリオがサポートされています。 MSAL.NET は後者にのみ使用されます。

開発者は、ブラウザー (または iOT) のないデバイスで実行されている Web アプリケーション、モバイル アプリケーション、デスクトップ アプリケーション、Web API、アプリケーションなど、さまざまな 種類のアプリケーションからトークンを取得できます。 これらの種類のアプリケーションは、次の 2 つのカテゴリに分かれています。

  • パブリック クライアント アプリケーション (デスクトップとモバイル) では、 PublicClientApplication クラスを使用します
  • 機密クライアント アプリケーション (Web アプリ、Web API、デーモン アプリケーション - デスクトップまたは Web)。 これらの種類のアプリでは、 ConfidentialClientApplicationが使用されます。

MSAL.NET では、ユーザーユーザー アイコンの名前、または (および機密クライアント アプリケーションの場合のみ) アプリケーション自体の名前 (ユーザーなし) でトークンを取得できます。 その場合、機密クライアント アプリケーションは、Microsoft Entra ID Microsoft Entra ID アイコンを使用してシークレットを共有します

MSAL.NET では、さまざまなプラットフォーム (.NET Framework、.NET、.NET MAUI) がサポートされています。 .NETアプリは、異なるオペレーティング システム (Windows、Linux、macOS) でも実行できます。 シナリオは、プラットフォームによって異なる場合があります。

シナリオ

次の図は、サポートされているシナリオをまとめたものであり、どのプラットフォームで、どのMicrosoft Entraプロトコルに対応するかを示しています。

サポートされているシナリオとプラットフォームを示す画像

ユーザーをサインインさせ、ユーザーの代わりに Web API を呼び出す Web アプリ

Web アプリ (ユーザーのサインイン) を保護するには、ASP.NET OpenID Connect ミドルウェアで ASP.NET または ASP.NET Coreを使用します。 これには、MSAL.NET ではなく、.NET ライブラリの IdentityModel 拡張機能によって実行されるトークンの検証が含まれます。

ユーザーの名前で Web API を呼び出すには、MSAL.NET ConfidentialClientApplicationを使用し、Authorization コード フローを利用し、取得したトークンをトークン キャッシュに格納し、必要に応じキャッシュからトークンをサイレントで取得します。 必要に応じて、MSAL によってトークンが更新されます。

ユーザーをサインインさせ、ユーザーに代わって Web API を呼び出す Web アプリのフローを示す画像

対話形式でサインインしているユーザーの代わりに Web API を呼び出すモバイル アプリ

モバイル アプリケーションから Web API を呼び出すには、MSAL.NET の PublicClientApplication の対話型トークン取得メソッドを使用します。 これらの対話型メソッドを使用すると、サインイン UI エクスペリエンスと、一部のプラットフォームでの対話型ダイアログの場所を制御できます。

この対話を有効にするために、MSAL.NET は Web ブラウザーを利用します。 モバイル プラットフォームに応じて固有性があります。 iOS および Android では、システム ブラウザー (既定) または埋め込み Web ブラウザーのどちらを利用するかを選択できます。 iOS でトークン キャッシュ共有を有効にすることができます。

ユーザーの代わりに Web API を呼び出すモバイル アプリのフローを示す画像

Intune を使用したアプリ自体の保護

モバイル アプリ (Xamarin.iOS または Xamarin で記述)。Android) にアプリ保護ポリシーを適用して、InTune で管理し、Intune で管理対象アプリとして認識できるようにすることができます。 InTune SDK は MSAL とは別であり、単独でMicrosoft Entra IDと通信します。

(独自の名前で) Web API をそれ自体として呼び出すデスクトップまたはサービス デーモン アプリ

MSAL.NET の ConfidentialClientApplication のクライアント資格情報取得方法を使用して、独自の ID を使用してトークンを取得するデーモン アプリを作成できます。 これらは、アプリが以前にシークレット (アプリケーション パスワードまたは証明書) をMicrosoft Entra IDに登録し、それをこの呼び出しと共有したとします。

独自の ID を使用して Web API を呼び出すデーモン アプリを示す画像

サインイン済みのユーザーに代わって Web API を呼び出すデスクトップ アプリ

デスクトップ アプリケーションでは、モバイル アプリケーションと同じ対話型認証を使用できます。

サインインしているユーザーの代わりに Web API を呼び出すデスクトップ アプリのフローを示す画像

Windowsホストされているアプリケーションの場合は、Windows ドメインに参加しているコンピューターまたは参加しているMicrosoft Entraで実行されているアプリケーションが、統合Windows認証を使用してトークンをサイレントに取得することもできます。

デスクトップ アプリケーションが Linux または Mac で実行されている .NET Core アプリケーションの場合、対話型認証フロー (.NET Core では Web ブラウザーが提供されないため) も、統合Windows認証も使用できません。 その場合の最適なオプションは、 ブラウザーを使用しないアプリケーション、またはユーザーの名前で API を呼び出す iOT アプリケーションで説明されているように、デバイス コード フローを使用することです。

推奨されませんが、パブリック クライアント アプリケーションでは ユーザー名とパスワードのフロー を使用できます。一部のシナリオ (DevOps など) では引き続き必要ですが、使用するとアプリケーションに制約が課されることに注意してください。 たとえば、Multi Factor Authentication (条件付きアクセス) を実行する必要があるユーザーをサインインさせたり、シングル サインオン (SSO) の利点を活用したりすることはできません。 ユーザー名とパスワードのフローは先進認証の原則に反し、従来の理由でのみ提供されます。

デスクトップ アプリケーションでは、トークン キャッシュを永続的にする場合は、 トークン キャッシュのシリアル化をカスタマイズする必要があります。

ブラウザーのないアプリケーション、またはユーザーの名前で API を呼び出す iOT アプリケーション

ブラウザーのないデバイスで実行されているアプリケーションは、ユーザーが Web ブラウザーを持つ別のデバイスにサインインした後も、ユーザー名で API を呼び出すことが可能です。 このためには、デバイス コード フローを使用する必要があります

ユーザーの代わりに API を呼び出すブラウザーレス アプリのフローを示す画像

呼び出されたユーザーの名前で別のダウンストリーム Web API を呼び出す Web API

ASP.NET または ASP.NET Core保護された Web API で、アクセス トークンによって表されるユーザーに代わって別の Web API を呼び出して API を呼び出す場合は、次の操作を行う必要があります。

  • トークンを検証します。 このためには、内部で ASP.NET JWT ミドルウェアを使用します。 これには、MSAL.NET ではなく、.NET ライブラリの IdentityModel 拡張機能によって行われるトークンの検証も含まれます。
  • 次に、ConfidentialClientApplication のメソッドを使用してダウンストリーム Web API のトークンを取得する必要があります。サービス間呼び出しで ユーザーに代わって トークンを取得します。
  • 他の Web API を呼び出す Web API も、 カスタム キャッシュのシリアル化を提供する必要があります。

ダウンストリーム Web API を呼び出す Web API のフローを示す画像

独自の名前で別の API を呼び出す Web API

デスクトップまたはサービス デーモン アプリケーションと同様に、デーモン Web API (またはデーモン Web アプリ) でも、MSAL.NET の ConfidentialClientApplication のクライアント資格情報取得方法を使用できます。

横の特徴

すべてのシナリオで、次の操作を実行できます。

  • ログまたはテレメトリをアクティブ化して自分のトラブルシューティングを行う
  • Microsoft Entra サービスのMsalServiceException、またはクライアント自体で何か問題が発生したために例外に対応する方法を理解するMsalClientException
  • プロキシで MSAL.NET を使用する