使用nuget.exe認證提供者驗證摘要
已在版本 3.3
支援中新增 nuget.exe
特定 (v1) 認證提供者。 自那時起,已新增跨所有命令行案例運作的 (v2) 認證提供者版本4.8
支援。nuget.exe
。dotnet.exe
msbuild.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();