NuGet のクロス プラットフォーム認証プラグイン

バージョン 4.8 以降では、すべての NuGet クライアント (NuGet.exe、Visual Studio、dotnet.exe、MSBuild.exe) で、NuGet クロス プラットフォーム プラグイン モデル上に構築された認証プラグインを使用できます。

dotnet.exe での認証

Visual Studio と NuGet.exe は、既定では対話型です。 NuGet.exe には、非対話型にするためのスイッチが含まれています。 さらに、NuGet.exe および Visual Studio プラグインは、ユーザーに入力を求めます。 dotnet.exe には、プロンプトが存在せず、デフォルトでは非対話型です。

dotnet.exe の認証メカニズムはデバイス フローです。 復元またはパッケージの追加操作を対話形式で実行すると、操作ブロックと認証を完了する方法がコマンド ラインでユーザーに提供されます。 ユーザーが認証を完了すると、操作が続行されます。

操作を対話形式にするには、--interactiveを渡す必要があります。 現在、明示的なdotnet restoreコマンドとdotnet add packageコマンドのみが対話型スイッチをサポートしています。 dotnet builddotnet publish内でインタラクティブ スイッチは、オンにされていません、

MSBuild 内での認証

dotnet.exe と同様に、MSBuild.exe はデフォルトでは非対話型であり、MSBuild.exe 認証メカニズムはデバイス フローです。 復元を一時停止して認証を待機できるようにするには、msbuild -t:restore -p:NuGetInteractive="true"を使用して復元を呼び出します。

クロス プラットフォーム認証プラグインの作成

実装サンプルは、Microsoft Credential Provider プラグイン内にあります。

プラグインが NuGet クライアント ツールによって定められたセキュリティ要件に準拠していることが非常に重要です。 プラグインを認証プラグインにするために必要な最小バージョンは 2.0.0 です。 NuGet はプラグインとのハンドシェイクを実行し、サポートされている操作要求のクエリを実行します。 特定のメッセージの詳細については、NuGet クロス プラットフォーム プラグイン プロトコル メッセージ を参照してください。

NuGet はログ レベルを設定し、該当する場合はプロキシ情報をプラグインに提供します。 NuGet コンソールへのログ記録は、NuGet が、ログ レベルをプラグインに設定した後でのみ承諾されます。

  • .NET Framework プラグインの認証ビヘイビアー

.NET Framework では、プラグインを使用して、ダイアログ形式で、ユーザーに入力を求められます。

  • .NET Core プラグインの認証ビヘイビアー

.NET Core 内でダイアログが表示されません。 プラグインは、デバイス フローを使用して認証する必要があります。 プラグインは、ユーザーへの指示を含むログ メッセージを NuGet に送信できます。 ログ レベルがプラグインに設定された後にログが使用可能になることに注意してください。 NuGet は、コマンド ラインからの対話型の入力を取得しません。

クライアントが Get Authentication Credentials を使用してプラグインを呼び出す場合、プラグインは対話機能スイッチに準拠して、ダイアログ スイッチを尊重することが必要です。

次の表は、すべての組み合わせに対するプラグインのビヘイビアーを要約したものです。

IsNonInteractive CanShowDialog プラグインのビヘイビアー
true true IsNonInteractive スイッチはダイアログ スイッチよりも優先されます。 プラグインは、 ダイアログをポップすることはできません。 この組み合わせは .NET Framework プラグインでのみ有効です
true false IsNonInteractive スイッチはダイアログ スイッチよりも優先されます。 プラグインは、ブロックすることができません。 この組み合わせは .NET Core プラグインでのみ有効です
false true プラグインに、ダイアログが表示されます。 この組み合わせは .NET Framework プラグインでのみ有効です
false false プラグインはダイアログを表示することができません。 プラグインは、デバイス フローを使用し、ロガーを介して命令メッセージを記録することで認証する必要があります。 この組み合わせは .NET Core プラグインでのみ有効です

プラグインを書く前に、次の仕様書を参照してください。