共用方式為


使用nuget.exe認證提供者驗證摘要

已在版本 3.3 支援中新增 nuget.exe 特定 (v1) 認證提供者。 自那時起,已新增跨所有命令行案例運作的 (v2) 認證提供者版本4.8支援。nuget.exedotnet.exemsbuild.exe

如需所有驗證方法的詳細資訊,請參閱 從已驗證摘要 取用套件。

nuget.exe認證提供者探索

nuget.exe認證提供者可以使用 3 種方式:

  • 全域:若要讓認證提供者可供目前使用者配置檔下執行的所有實例nuget.exe使用,請將它新增至 %LocalAppData%\NuGet\CredentialProviders。 您可能需要建立 CredentialProviders 資料夾。 認證提供者可以安裝在資料夾的 CredentialProviders 根目錄或子資料夾中。 如果認證提供者有多個檔案/元件,您可以使用子資料夾讓提供者保持組織。

  • 從環境變數:認證提供者可以儲存在任何地方,並藉由將%NUGET_CREDENTIALPROVIDERS_PATH%環境變數設定為提供者位置來存取nuget.exe。 如果您有多個位置, path1;path2這個變數可以是分號分隔清單(例如)。

  • 除了nuget.exe:nuget.exe認證提供者可以放在與 nuget.exe相同的資料夾中。

載入認證提供者時, nuget.exe 依序搜尋上述位置是否有任何名為 credentialprovider*.exe的檔案,然後依找到的順序載入這些檔案。 如果多個認證提供者存在於相同的資料夾中,則會依字母順序載入它們。

建立nuget.exe認證提供者

認證提供者是命令行可執行檔,其格式 CredentialProvider*.exe為 ,會收集輸入、視需要取得認證,然後傳回適當的結束狀態代碼和標準輸出。

提供者必須執行下列動作:

  • 在起始認證擷取之前,判斷它是否可以提供目標 URI 的認證。 如果沒有,它應該會傳回沒有認證的狀態代碼 1。
  • 請勿修改 NuGet.Config (例如設定那裡的認證)。
  • 自行處理 HTTP Proxy 設定,因為 NuGet 不會提供外掛程式的 Proxy 資訊。
  • 使用UTF-8編碼將 JSON 回應物件寫入 stdout,以傳回認證或錯誤詳細 nuget.exe 數據。
  • 選擇性地將其他追蹤記錄發出至 stderr。 不應該將秘密寫入 stderr,因為 NuGet 會以詳細資訊層級「正常」或「詳細」的方式將這類追蹤回應至控制台。
  • 應該忽略非預期的參數,以提供未來 NuGet 版本的向前相容性。

輸入參數

參數/參數 描述
Uri {value} 需要認證的套件來源 URI。
NonInteractive 如果存在,提供者不會發出互動式提示。
IsRetry 如果存在,表示此嘗試是先前失敗嘗試的重試。 提供者通常會使用此旗標來確保它們會略過任何現有的快取,並盡可能提示輸入新的認證。
詳細信息 {value} 如果存在,下列其中一個值:“normal”、“quiet” 或 “detailed”。 如果未提供任何值,則預設為 「normal」。。 提供者應該使用此選項作為選擇性記錄層級的指示,以發出至標準錯誤數據流。

結束代碼

代碼 結果 描述
0 Success 已成功取得認證,並已寫入 stdout。
1 ProviderNotApplicable 目前的提供者不提供指定 URI 的認證。
2 失敗 提供者是指定 URI 的正確提供者,但無法提供認證。 在此情況下,nuget.exe不會重試驗證,而且會失敗。 典型的範例是當使用者取消互動式登入時。

標準輸出

屬性 備註
使用者名稱 已驗證要求的用戶名稱。
密碼 已驗證要求的密碼。
訊息 回應的選擇性詳細數據,僅用於在失敗案例中顯示其他詳細數據。

範例 stdout:

{ "Username" : "freddy@example.com",
    "Password" : "bwm3bcx6txhprzmxhl2x63mdsul6grctazoomtdb6kfbof7m3a3z",
    "Message"  : "" }

針對認證提供者進行疑難解答

目前,NuGet 不會提供對自定義認證提供者進行偵錯的直接支援; 問題 4598 正在追蹤這項工作。

您也可以嘗試執行下列操作:

  • 使用 參數執行 -verbosity nuget.exe,以檢查詳細的輸出。

  • 將偵錯訊息新增至 stdout 適當的位置。

  • 請確定您使用的是 nuget.exe 3.3 或更高版本。

  • 使用此代碼段在啟動時附加除錯程式:

    while (!Debugger.IsAttached)
    {
        System.Threading.Thread.Sleep(100);
    }
    Debugger.Break();