.NET混合開發解決方案14 WebView2的基本身份驗證

WebView2控件應用詳解系列博客

.NET桌面程序集成Web網頁開發的十種解決方案

.NET混合開發解決方案1 WebView2簡介

.NET混合開發解決方案2 WebView2與Edge瀏覽器的區別

.NET混合開發解決方案3 WebView2的進程模型

.NET混合開發解決方案4 WebView2的線程模型

.NET混合開發解決方案5 WebView2運行時與分發應用

.NET混合開發解決方案7 WinForm程序中通過NuGet管理器引用集成WebView2控件

.NET混合開發解決方案8 WinForm程序中通過設置固定版本運行時的BrowserExecutableFolder屬性集成WebView2控件

.NET混合開發解決方案9 WebView2控件的導航事件

.NET混合開發解決方案10 WebView2控件調用網頁JS方法

.NET混合開發解決方案11 網頁JS調用C#方法

.NET混合開發解決方案12 網頁JS調用C#方法訪問WinForm或WPF窗體

.NET混合開發解決方案13 自定義WebView2中的上下文菜單

  WebView2 應用的基本身份驗證包括從 HTTP 服務器檢索網頁的一系列身份驗證和導航步驟。 WebView2 控件充當主機應用和 HTTP 服務器之間通信的中介。

友情提醒:使用基本身份驗證時必須使用 HTTPS。 否則,用戶名和密碼不加密。 您可能需要考慮其他形式的身份驗證。 基本身份驗證的 HTTP 標準包括未加密 (用戶名和密碼) 憑據。 因此,必須使用 HTTPS以確保憑據已加密。

導航事件的順序

基本身份驗證事件在事件序列的中間發生:

  1. NavigationStarting - 導航事件
  2. ContentLoading - 導航事件
  3. BasicAuthenticationRequested
  4. DOMContentLoaded
  5. NavigationCompleted - 導航事件
HTTP 服務器、WebView2 控件和主機應用之間的通信
  • HTTP 服務器檢查身份驗證 (用戶名和密碼憑據) 並返回錯誤文檔或請求的網頁。

  • WebView2 控件實例引發事件。 WebView2 控件位於 HTTP 服務器和主機應用之間。 WebView2 控件充當主機應用和 HTTP 服務器之間通信的中介。

  • 編寫主機應用。 主機應用在響應對象中設置事件參數 () EventArgs 密碼。

BasicAuthenticationRequestedEventArgs 具有 屬性 Response 。 屬性 Response 是包含用戶名和密碼屬性的對象。

導航事件流程

下圖顯示了 WebView2 應用的基本身份驗證的導航事件流:

  1. 主機應用指示 WebView2 控件導航到 URI。

  2. WebView2 控件與 HTTP 服務器通信,請求獲取位於指定 URI 的文檔。

  3. HTTP 服務器答覆 WebView2 控件,指出"未經身份驗證 (無法獲取) URI"。

  4. WebView2 控件指示主機應用"需要身份驗證" (BasicAuthenticationRequested事件) 。

  5. 主機應用通過向 WebView2 控件提供用戶名和密碼來響應該事件。

  6. WebView2 控件再次從 HTTP 服務器請求 URI,但這次使用的是身份驗證 (用戶名和密碼) 。

  7. HTTP 服務器對用戶名和密碼 (憑據) 進行評估。

  8. HTTP 服務器可能會拒絕憑據並請求新的憑據。

  9. HTTP 服務器可能會拒絕用戶名和密碼;它可能會告訴 WebView2 控件"不允許獲取該 URI/文檔"。

  10. WebView2 控件呈現 HTTP 服務器返回的錯誤頁。 呈現發生在ContentLoading 事件和 DOMContentLoaded 事件之間。

  11. HTTP 服務器可能會接受身份驗證憑據並返回請求的文檔。

  12. WebView2 控件呈現返回的文檔。 呈現發生在 ContentLoading 事件和 DOMContentLoaded 事件之間。

示例程序

BasicAuthenticationRequeste事件中實現具體的校驗憑證邏輯

 1 private void CoreWebView2_BasicAuthenticationRequested(object? sender, CoreWebView2BasicAuthenticationRequestedEventArgs args)
 2 {
 3     /* 開發者需要異步顯示UI,以便獲得 CoreWebView2Deferral 對象。
 4      * 該對象將延遲 CoreWebView2 檢查開發者在事件參數上設置的屬性,直到稍後異步調用 Complete 方法。
 5      * 這給了開發者異步顯示UI的時間。
 6      */
 7     CoreWebView2Deferral deferral = args.GetDeferral();
 8 
 9     // 通過在異步完成延遲後顯示下載對話框,我們避免了在事件處理程序中運行消息循環的潛在可重入性
10     System.Threading.SynchronizationContext.Current.Post((_) =>
11                                                          {
12                                                              using (deferral)
13                                                              {
14                                                                  // 提示最終用戶進行身份驗證時,重要的是向他們顯示請求身份驗證的URI或URI的來源,以便最終用戶知道他們將用戶名和密碼提供給誰。
15 
16                                                                  // 向最終用戶顯示挑戰也很重要,因爲它可能會爲最終用戶提供重要的站點特定信息,以提供正確的用戶名和密碼
17 
18                                                                  // 使用應用程序或UI框架方法從最終用戶獲取輸入。
19 
20                                                                  bool userNameAndPasswordSet = false;
21                                                                  Frm6Auth frm = new Frm6Auth(args.Uri);
22                                                                  DialogResult dialogResult = frm.ShowDialog();
23                                                                  if (dialogResult == DialogResult.OK)
24                                                                  {
25                                                                      args.Response.UserName = frm.UserName;
26                                                                      args.Response.Password = frm.UserPwd;
27                                                                      userNameAndPasswordSet = true;
28                                                                  }
29 
30                                                                  /* TODO 此處要做真正的認證校驗。測試程序只做舉例說明 */
31                                                                  if (args.Response.UserName != "admin" && args.Response.Password != "admin123456")
32                                                                  {
33                                                                      MessageBox.Show("用戶名與密碼不正確。", "提示",
34                                                                          MessageBoxButtons.RetryCancel,
35                                                                          MessageBoxIcon.Warning);
36 
37                                                                      userNameAndPasswordSet = false;
38                                                                  }
39 
40                                                                  // 如果我們沒有從最終用戶那裏獲得用戶名和密碼。我們取消認證請求,不提供任何認證
41                                                                  if (!userNameAndPasswordSet)
42                                                                  {
43                                                                      args.Cancel = true;
44                                                                  }
45                                                              }
46                                                          }, null);
47 }

Frm6Auth窗體如下

有兩種類型的導航:

  • "服務器請求的身份驗證"導航。
  • "服務器爲 WebView2 控件提供文檔"導航。

  第一種類型的導航後,服務器要求進行身份驗證,並且應用需要再次嘗試這種導航 (使用新的導航 ID) 。 新導航將使用主機應用從事件參數響應對象獲取的任何內容。

  HTTP 服務器可能需要 HTTP 身份驗證。 在這種情況下,存在第一 個導航,該導航具有上面列出的導航事件。 HTTP 服務器返回 401 或 407 HTTP 響應 NavigationCompleted ,因此事件具有相應的失敗。 然後,WebView2 呈現空白頁 BasicAuthenticationRequested 並引發事件,這可能會提示用戶輸入憑據。

  • BasicAuthenticationRequested如果取消該事件,則沒有後續導航,並且 WebView2 將保留以顯示空白頁。
  • BasicAuthenticationRequested如果未取消該事件,WebView2 將再次執行初始導航,但這次使用任何提供的憑據。 你將再次看到與之前相同的導航事件。

  如果 HTTP 服務器不接受憑據,導航將再次因 401 或 407 失敗。 在這種情況下,類 CoreWebView2 實例將再次引發 BasicAuthenticationRequested 事件,並且導航將繼續,如上所述。

  如果 HTTP 服務器接受憑據,則導航成功。 如果 HTTP 服務器拒絕身份驗證,則 (通常返回錯誤頁) 。

事件之前和之後導航 BasicAuthenticationRequested 是不同的導航,並且具有不同的導航 ID。導航event args有一個屬性:NavigationId 與 NavigationId 單個導航對應的導航事件緊密結合。 在每個 NavigationId 導航過程中保持不變,如重試。 在下次傳遞事件流期間,使用不同的 NavigationId 方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章