ブローカーを使用して認証することをお勧めします。ブラウザーと比較して、より多くの利点が提供されるためです。 Windowsコンピューターでは、ブローカーは Web アカウント マネージャー (WAM) であり、Android と iOS では Microsoft Authenticator または Intune ポータル サイト。 対話型認証では、ブローカーまたは Web ブラウザーを使用する必要があります。 MSAL.NET は、システム Web ブラウザーまたは埋め込み Web ビューをサポートします。
MSAL.NET の Web ブラウザー
Web ブラウザーで対話が行われる
対話形式でトークンを取得する場合、ダイアログ ボックスの内容はライブラリではなくMicrosoft Entra IDによって提供されることを理解しておくことが重要です。 認証エンドポイントは、Web ブラウザーまたは Web コントロールでレンダリングされる対話を制御する HTML と JavaScript を返します。 Microsoft Entra IDが HTML の対話を処理できるようにするには、多くの利点があります。
- パスワードが入力された場合、アプリケーションや認証ライブラリには保存されません。
- これにより、他の ID プロバイダー (職場または学校アカウントでのサインイン、MSAL を使用した個人アカウント、Azure AD B2C を使用したソーシャル アカウント) へのリダイレクトが可能になります。
- これにより、Microsoft Entra ID で条件付きアクセスを制御できます。たとえば、認証時にユーザーに 多要素認証 (MFA) を求めることで制御できます。具体的には、Windows Hello の PIN を入力したり、ユーザーの電話への着信に応答したり、電話上の認証アプリを使用したりします。 必要な多要素認証がまだ設定されていない場合、ユーザーは同じダイアログで Just-In-Time を設定できます。 ユーザーは携帯電話番号を入力し、認証アプリケーションをインストールし、QR タグをスキャンしてアカウントを追加するように案内されます。 このサーバー駆動型の操作は、優れたエクスペリエンスです。
- パスワードの有効期限が切れたときに、ユーザーはこの同じダイアログでパスワードを変更できます (古いパスワードと新しいパスワードの追加フィールドを指定します)。
- これにより、Microsoft Entra テナント管理者またはアプリケーション所有者によって制御されるテナントまたはアプリケーション (イメージ) のブランド化が可能になります。
- これにより、ユーザーは認証の直後にアプリケーションが自分の名前のリソースとスコープにアクセスすることに同意できます。
埋め込み Web ビューとシステム ブラウザー
MSAL.NET はマルチフレームワーク ライブラリであり、UI コントロールでブラウザーをホストするためのフレームワーク固有のコードを持っています (たとえば、WinForms または WebView2 の.NET、.NET MAUI、ネイティブ モバイル コントロールなど)。 このコントロールは 、埋め込み Web ビューと呼ばれます。 または、MSAL.NET はシステム Web ブラウザーを開くこともできます。
一般に、プラットフォームの既定値を使用することをお勧めします。これは通常、システム ブラウザーです。 システム ブラウザーは、以前にログインしたユーザーを記憶する方が優れています。 この動作を変更するには、 WithUseEmbeddedWebView(Boolean)
ブラウザーの可用性
| フレームワーク | 内蔵型 | システム† | Default |
|---|---|---|---|
| .NET 6 + †† | ⛔ いいえ | ✅ はい | システム |
| .NET 6 以上のWindows | ⛔ いいえ††† | ✅ はい | システム |
| .NET MAUI | ✅ はい | ✅ はい | システム |
| .NET 5 + †† | ⛔ いいえ | ✅ はい | システム |
| .NET 4.6.2 以降 | ✅ はい | ✅ はい | 内蔵型 |
| .NET Standard | ⛔ いいえ††† | ✅ はい | システム |
| .NET コア | ⛔ いいえ††† | ✅ はい | システム |
† システム ブラウザーには http://localhost リダイレクト URI が必要です。
†† 埋め込みブラウザーを使用するには、 net6.0-windows 以上をターゲットにします。
†††参照Microsoft。Identity.Client.Desktop を呼び出し、WithWindowsDesktopFeaturesを呼び出して埋め込みブラウザーを使用します。
システム Web ブラウザー
システム ブラウザーを使用すると、ブローカー (WAM、ポータル サイト、Authenticator など) を必要とせずに、単一 Sign-On (SSO) 状態を Web アプリケーションやその他のアプリケーションと共有できるという大きな利点があります。
ただし、デスクトップ アプリケーションの場合、システム ブラウザーを起動すると、ユーザーにブラウザーが表示され、他のタブが既に開かれている可能性があるため、サブパー ユーザー エクスペリエンスが発生します。 認証が行われると、ユーザーにこのウィンドウを閉じるように求めるページが表示されます。 ユーザーが注意を払わない場合は、プロセス全体 (認証とは無関係な他のタブを含む) を閉じる可能性があります。 デスクトップでシステム ブラウザーを利用するには、ローカル ポートを開いてリッスンする必要もあります。そのためには、アプリケーションの高度なアクセス許可が必要になる場合があります。 開発者、ユーザー、または管理者は、この要件に消極的である可能性があります。
既定のシステム ブラウザーを使用する方法
.NETでは、MSAL は別のプロセスとしてシステム ブラウザーを起動します。 MSAL.NET はこのブラウザーを制御できませんが、ユーザーが認証を完了すると、パブリック クライアント インスタンスの作成時に指定されたリダイレクト URI の呼び出し MSAL.NET インターセプトできるように Web ページがリダイレクトされます。
MSAL.NET は、ユーザーが離れて移動したか、単にブラウザーを閉じるのか検出できません。 この手法を使用するアプリでは、 CancellationTokenを使用してタイムアウトを定義することをお勧めします。 パスワードの変更または多要素認証の実行をユーザーに求められる場合を考慮するために、少なくとも数分のタイムアウトをお勧めします。
ユーザーの認証が完了したときに Microsoft Entra ID から返されるコードを受け取るため、MSAL.NET は http://localhost:port で待ち受ける必要があります。 詳細については、 承認コード フロー を参照してください。
システム ブラウザーを有効にするには:
- ポータルでのアプリの登録時に、
http://localhostをリダイレクト URI として構成します (現在、Azure B2C ではサポートされていません)。 - パブリック クライアント アプリを構築するときは、このリダイレクト URI を指定します。
-
.WithUseEmbeddedWebView(false)を追加します。
var pca = PublicClientApplicationBuilder
.Create("<CLIENT_ID>")
// or use a known port if you wish "http://localhost:1234"
.WithRedirectUri("http://localhost")
.Build();
var result = await pca.AcquireTokenInteractive(s_scopes)
.WithUseEmbeddedWebView(false)
.ExecuteAsync();
http://localhostを構成すると、MSAL.NET はランダムに開いているポートを見つけて使用します。 リダイレクト URI として http://localhost を使用しても安全です。 別のプロセスは、MSAL によって既にリッスンされているローカル ソケットでリッスンできません。 ブラウザーがこの URI にリダイレクトされるときに、ネットワーク通信は行われません。 何らかの方法で悪意のあるアプリが認証コードを傍受した場合でも (そのような既知の攻撃はありませんが、悪意のあるアプリがコンピューターに管理者アクセスできる場合は可能です)、 PKCE プロトコルで説明されているように、アプリだけが認識する一時的なシークレットが必要なため、トークンと交換できません。 ポート 443 が予約されており、MSAL がリッスンできないため、アプリは HTTPS localhost エンドポイント (https://localhost) でリッスンできません。
Limitations
Azure B2C と ADFS 2019 では、どのポート オプションもまだ実装されていません。 そのため、 http://localhost (ポートなし) リダイレクト URI は設定できませんが、(ポートを含む) URI のみを http://localhost:1234 。 つまり、独自のポート管理を行う必要があります。たとえば、いくつかのポートを予約し、リダイレクト URI として構成できます。 その後、アプリはポートが空になるまでそれらを循環させることができます。これは MSAL で使用できます。
詳細については、 Localhost の例外に関するページを参照してください。
Linux と macOS
Linux では、MSAL.NET は xdg-open などのツールを使用して既定のシステム ブラウザーを開きます。
sudoでブラウザー*を開く方法は MSAL ではサポートされていないため、MSAL によって例外*がスローされます。
macOS では、 open <url>を呼び出すことによってブラウザーが開きます。
エクスペリエンスのカスタマイズ
MSAL.NET は、トークンを受信したとき、またはエラーが発生したときに、HTTP メッセージまたは HTTP リダイレクトで応答できます。
var options = new SystemWebViewOptions()
{
HtmlMessageError = "<p> An error occurred: {0}. Details {1}</p>",
BrowserRedirectSuccess = new Uri("https://www.microsoft.com");
}
await pca.AcquireTokenInteractive(s_scopes)
.WithUseEmbeddedWebView(false)
.WithSystemWebViewOptions(options)
.ExecuteAsync();
特定のブラウザーを開く
MSAL.NET でのブラウザーの開き方をカスタマイズできます。 たとえば、既定のブラウザーを使用する代わりに、特定のブラウザーを強制的に開くことができます。
var options = new SystemWebViewOptions()
{
OpenBrowserAsync = SystemWebViewOptions.OpenWithEdgeBrowserAsync
}
モバイル アプリケーションの Web ビュー
Note
MSAL.NET バージョン 4.61.0 以降では、Xamarin Android および Xamarin iOS はサポートされていません。
埋め込み Web ビューは、.NET MAUI アプリケーションで有効にすることができます。 埋め込み Web ビューまたはシステム ブラウザーのいずれかを使用できます。 これは、ターゲットとするユーザー エクスペリエンスとセキュリティ上の問題に応じて選択できます。
埋め込み Web ビューとシステム ブラウザーの違い
MSAL.NET の埋め込み Web ビューとシステム ブラウザーには、いくつかの視覚的な違いがあります。
埋め込み Web ビューを使用した MSAL.NET での対話型サインイン:
システム ブラウザーを使用した MSAL.NET での対話型サインイン:
開発者向けオプション
MSAL.NET を使用する開発者には、Microsoft Entra IDから対話型サインイン ダイアログを表示するためのオプションがいくつかあります。
- システム ブラウザー。 システム ブラウザーは、ライブラリで既定で設定されます。 Android を使用している場合は、認証でサポートされているブラウザーの詳細については、 システム ブラウザーを参照してください。 Android でシステム ブラウザーを使用する場合は、Chrome カスタム タブをサポートするブラウザーをデバイスにインストールすることをお勧めします。そうしないと、認証が失敗する可能性があります。
- 埋め込み Web ビュー。 MSAL.NET で埋め込み Web ビューのみを使用するには、
AcquireTokenInteractiveビルダーに WithUseEmbeddedWebView メソッドが含まれています。
iOS アプリの場合:
var result = app.AcquireTokenInteractive(scopes)
.WithUseEmbeddedWebView(useEmbeddedWebview)
.ExecuteAsync();
Android アプリの場合:
var result = app.AcquireTokenInteractive(scopes)
.WithParentActivityOrWindow(activity)
.WithUseEmbeddedWebView(useEmbeddedWebview)
.ExecuteAsync();
iOS での埋め込み Web ビューまたはシステム ブラウザーの選択
iOS アプリでは、 AppDelegate.cs で ParentWindow を初期化して nullできます。 iOS では使用されません。
App.ParentWindow = null; // no UI parent on iOS
Android での埋め込み Web ビューまたはシステム ブラウザーの選択
Android アプリでは、 MainActivity.cs で親アクティビティを設定して、認証結果が返されるようにすることができます。
App.ParentWindow = this;
次に、 MainPage.xaml.csで次の手順を実行します。
var result = await App.PCA.AcquireTokenInteractive(App.Scopes)
.WithParentActivityOrWindow(App.ParentWindow)
.WithUseEmbeddedWebView(true)
.ExecuteAsync();
Android でのカスタム タブの存在の検出
システム Web ブラウザーを使用して、ブラウザーで実行されているアプリで Single-Sign On を有効にしたいが、Android デバイスのユーザー エクスペリエンスにカスタム タブがサポートされていない場合は、 IPublicClientApplication.IsSystemWebViewAvailableを呼び出して決定できます。 このメソッドは、Android パッケージ マネージャーがカスタム タブを検出した場合に true を返し、デバイスで検出されない場合は false します。
このメソッドによって返される値と要件に基づいて、次の決定を行うことができます。
- カスタム エラー メッセージをユーザーに返すことができます。たとえば、"Chrome をインストールして認証を続行してください" などです。
- フォールバックして、埋め込み Web ビューでサインイン ページを起動できます。
bool useSystemBrowser = app.IsSystemWebViewAvailable();
authResult = await App.PCA.AcquireTokenInteractive(App.Scopes)
.WithParentActivityOrWindow(App.ParentWindow)
.WithUseEmbeddedWebView(!useSystemBrowser)
.ExecuteAsync();