簡體   English   中英

Windows Blazor 服務器應用程序的身份驗證 - 登錄彈出窗口

[英]Windows Authentication for Blazor Server app - login popup

我正在使用 .NET 6.0.11 構建一個 Blazor 服務器應用程序並使用 Http.Sys 進行部署。 服務器和客戶端都在同一個 Windows 域中。 我想根據用戶的域登錄來授權用戶,而不是構建特定於此應用程序的用戶名/密碼數據庫和基礎設施。

Program.cs中啟用 Windows 身份驗證的代碼,基於官方文檔中的代碼:

if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
    builder.Services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);
    builder.WebHost.UseHttpSys(options =>
    {
        options.Authentication.Schemes =
            AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;            
        options.Authentication.AllowAnonymous = false;
    });
}

// ...
app.UseAuthentication();
app.UseAuthorization();

我使用ASP.NET 核心 Blazor 身份驗證和授權中的第一個代碼示例查看身份驗證 state。

如果我在http://localhost:55555上啟動應用程序,那么頁面會立即加載並成功顯示我的域和用戶名。

但是,如果我以http://mycomputername.our.domain:55555啟動應用程序,並在同一台機器上通過 Chrome 或 Edge 訪問它,則會出現一個彈出窗口,要求輸入用戶名和密碼:

登錄彈窗

注意:我不得不運行netsh http add urlacl url=....一次; 該命令是由在更改啟動 URL 后首次運行時生成的異常消息建議的。

輸入我的域登錄用戶名和密碼被接受,前面的代碼示例確實成功顯示了我的用戶名。 我還注意到以下行為:

  • 設置AllowAnonymous = true; 意味着它根本不會提示輸入用戶名/密碼; 該頁面僅處理未通過身份驗證的用戶。
  • 如果用戶名/密碼輸入不正確(對於域中的用戶),則會立即生成 HTTP 錯誤 401,例如,它永遠不會嘗試執行 Blazor 默認錯誤頁面。
  • 我希望身份驗證是在客戶端和域 controller 之間完成的,而不是通過 HTTP 連接發送用戶密碼!

我假設上述行為對於訪問此服務器的不同機器上的其他域使用是相同的,盡管尚未測試。

我的問題:

  • 是否可以跳過用戶名/密碼彈出窗口,只獲取已經在客戶端計算機上登錄並進行訪問的域用戶?
  • (如果不是)部署到 IIS 而不是 Http.Sys 會改變什么嗎?

這個 SO thread上似乎討論了基於 Blazor 的解決方案,但我看不到如何使用它們,因為在呈現任何頁面之前,只要嘗試任何頁面,彈出窗口總是會出現; 如果登錄失敗,則會生成 HTTP 401 錯誤,而 Blazor 頁面均未執行。

是否可以跳過用戶名/密碼彈出窗口,只獲取已經在客戶端計算機上登錄並進行訪問的域用戶?

恕我直言,這對於“windows 身份驗證”是不可能的,因為您看到的彈出對話框是一種特殊的瀏覽器功能,可啟用 windows 身份驗證。創建此對話框是為了支持具有域身份驗證的內部應用程序。 我不知道有什么方法可以訪問該瀏覽器行為。

(如果不是)部署到 IIS 而不是 Http.Sys 會改變什么嗎?

尚未使用 Http.Sys 進行部署,但根據文檔,它表示 Http.Sys 支持 windows 身份驗證。 部署會有所不同,因為對於 Http.Sys,您需要在代碼中編寫配置,這與 IIS 不同。

這是一個客戶端問題。

如果我在 http://localhost:55555 上啟動應用程序,那么頁面會立即加載並成功顯示我的域和用戶名。

但是,如果我以http://mycomputername.our.domain:55555啟動應用程序,並在同一台機器上通過 Chrome 或 Edge 訪問它,則會出現一個彈出窗口,要求輸入用戶名和密碼:

那是因為瀏覽器將localhost識別為您的 intr.net 中的(有點可信的)服務器,但將mycomputername.our.domain視為(潛在的敵對的)Inte.net 服務。 出於安全原因,默認情況下,Chrome 和 Edge 僅將您的 Windows 憑據用於您自己的 intr.net 中的服務器。

為了確定 URL 屬於哪個組,Chrome、Inte.net Explorer 和 Edge 使用 Windows 自己的“Intr.net 區域”設置。 要添加您的 URL,

  • 在 Windows 開始菜單中搜索“Inte.net 選項”,然后
  • 導航至 Security/Local intr.net/Sites/Advanced。

如果您想使用非基於 Chromium 的瀏覽器進行測試,請按以下步驟配置 Firefox。Firefox 管理其自己的 URL 列表,其中允許 Windows 身份驗證:

我希望身份驗證是在客戶端和域 controller 之間完成的,而不是通過 HTTP 連接發送用戶密碼!

如果客戶端和服務器同意使用 Kerberos,那么確定:客戶端與域 controller 通信以進行身份驗證並獲取服務票證,然后使用該票證訪問您的服務。

如果他們不同意,他們將使用 NTLM。 在這種情況下,身份驗證發生在客戶端和您的服務器之間。 但是,NTLM 也不會以純文本形式發送您的密碼,而是將其用作質詢-響應機制的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM