Windows 憑據管理器是一個內建在 Windows 作業系統中的功能,為使用者提供一種安全的方式來儲存和管理憑據。本文主要介紹如何在 .NET 中使用可以漫遊的 Web 憑據,以及使用中的基本事項。
1. 引言
在前面的文章【試用 Windows Terminal 中的 Terminal Chat 功能】中,我們曾提到為了保證配置的安全,Azure Openai 的配置資訊被儲存在憑據管理器中,類別為Web 憑據。今天我們就聊一聊如何在 .NET 中如何使用憑據管理器,本文將主要講述 Web 憑據的使用。
2. 憑據管理器
透過 Windows 憑據管理器,使用者可以儲存和管理憑據,這些憑據可以是使用者名稱和密碼、證書或其他憑據。我們可以看到憑據管理器中有兩個類別:Windows 憑據和 Web 憑據。
2.1 Windows 憑據
Windows 憑據管理器的一個特殊功能是它可以安全地儲存使用者的憑據。這意味著使用者的使用者名稱和密碼都被加密儲存,以防止未經授權的存取。此外,憑據管理器還可以備份和恢復使用者的憑據,這對於防止憑據遺失非常有用。
憑據管理器解決的主要問題是提供了一種簡單而安全的方式來管理使用者的憑據。使用者無需記住所有的使用者名稱和密碼,只需要將它們保存在憑據管理器中,然後在需要時,Windows 就會自動提供這些憑據。這大大簡化了使用者的工作,同時也提高了安全性。
2.2 Web 憑據
Web 憑據是一種特殊類別的憑據,它們用於儲存與 Web 網站和應用程式相關登入資訊的憑據。Web 憑據的一個特殊之處在於,它不像 Windows 憑據那樣可以自行添加和編輯。相反,Web 憑據是由瀏覽器和應用程式自動建立和管理的。
但是 Web 憑據卻有一個非常棒的地方,那就是它們可以在不同的器材之間同步。這意味著使用者可以在一個器材上建立一個 Web 憑據,然後在另一個器材上使用它。這對於那些經常在不同器材上工作的使用者來說非常有用。
3. UWP 套用中使用
在 UWP 中使用憑據管理器非常簡單,只需要使用
PasswordVault
類即可。
PasswordVault
類提供了一組方法,用於添加、刪除和檢索憑據。下面我們就來看一下如何使用
PasswordVault
類。以下只是基本的使用方法,更多的使用方法可以參考官方文件
[1]
。
添加憑據
添加憑據非常簡單,只需要呼叫
PasswordVault
類的
Add
方法即可。
Add
方法接收一個
PasswordCredential
物件作為參數,
PasswordCredential
物件包含了憑據的詳細資訊,包括使用者名稱、密碼和備註等。
var
vault = new
PasswordVault
();
vault.Add
(new
PasswordCredential
("WebResource"
, "UserName"
, "Password"
));
刪除憑據
刪除憑據也非常簡單,只需要呼叫
Remove
方法即可。
Remove
方法接收一個
PasswordCredential
物件作為參數,我們可以透過
Retrieve
方法來檢索。
var
vault = new
PasswordVault
();
vault.Remove
(vault.Retrieve
("WebResource"
, "UserName"
));
當然也可以自己建立一個
PasswordCredential
物件。
var
vault = new
PasswordVault
();
var
credential = new
PasswordCredential
()
{
Resource
= "WebResource"
,
UserName
= "UserName"
,
};
vault.Remove
(credential);
檢索憑據
檢索憑據前面刪除憑據中已經提到了,這裏就不再贅述了。獲取到
PasswordCredential
物件後,我們可以透過
Password
內容來獲取密碼。
var
vault = new
PasswordVault
();
var
password = vault.Retrieve
("WebResource"
, "UserName"
).Password
;
var
dialog = new
ContentDialog
()
{
Title
= "Password"
,
Content
= password,
PrimaryButtonText
= "OK"
,
};
await dialog.ShowAsync
();
4. WinForm 和 WPF 中使用
在 WinForm App 和 WPF APP 中使用也是非常簡單,同樣是需要使用
SWindows.Security.Credentials
名稱空間中。但是在 WinForm 和 WPF 中,我們在使用 .NET 5 及以上,比如當前的 .NET 8 建立好專案後,需要調整一下專案的目標框架。改為透過專案的 TargetFramework 內容指定要存取的 Windows API 版本。例如:
<TargetFramework>
net8.0-windows10.0.17763.0</TargetFramework>
其他就沒有什麽區別了,按照之前的使用方法即可。
5. 在 .Net Framework 中使用
新的 WinForm 形式其實也挺好用的,可以使用最新的 .NET 8 進行開發。非要用 .Net Framework 也不是不行,它也能使用 Window 憑據管理器,但要透過使用 P/Invoke 來呼叫 Windows API。不過,目前還沒有找到使用 web 憑據的方法。
P/Invoke 是可用於從受控代碼存取非托管庫中的結構、回呼和函數的一種技術。大多數 P/Invoke API 包含在以下兩個名稱空間中:System 和 System.Runtime.InteropServices。使用這兩個名稱空間可提供用於描述如何與本機元件通訊的工具。關於 P/Invoke 的更多資訊可以參考官方文件 [2] 。
這裏不再贅述 P/Invoke 的使用,感興趣的話可以透過相關的Win32 API 文件 [3] ,來實作在 .Net Framework 中使用 Windows 憑據管理器。
6. 特別註意
在 Windows 平台使用憑據管理器雖然方便,但是也有一個需要特別註意的地方:憑據的安全性。
6.1 不同使用方式的區別
UWP 套用中,擁有天然優勢,可以直接使用
PasswordVault
類,並且憑據顯示有保存者的資訊。這樣,就可以防止其他套用獲取到憑據。
如下圖所示:這裏面有兩個憑據,雖然他們的
Resource
和
UserName
內容都一直,但是一個是顯示了保存者為「CredentialsTest」套用,另一個是沒有保存者的。
也就是說,只有保存者為「CredentialsTest」套用的才能獲取到憑據。其他套用是無法獲取到憑據的。
而對於 WinForm 和 WPF 套用,雖然也可以使用,但是這種方式就沒有保存者的資訊。沒有保存著資訊的憑據,就相當於是大家公用的,可以被其他套用獲取到憑據內容,並隨意進行刪除和修改,這樣就會存在安全隱患。
6.2 確保安全性
如果你是透過桌面套用來使用憑據管理器,那麽需要註意憑據的安全性。因為桌面套用是可以被其他套用獲取到的。
為了防止惡意套用獲取到憑據,當然首先還是建議,能選 UWP 就選 UWP,畢竟 UWP 套用的安全性更高。
另外,也可以將憑據進行加密,然後再保存到憑據管理器中。這樣即使被獲取到,也無法直接使用。當然,這樣也會帶來一些不便,比如每次使用憑據時都需要解密,然後再使用。
當然,如果只是使用其漫遊和便捷的特性儲存一些不重要的憑據,那麽也可以不用考慮安全性問題。
7. 總結
本文主要介紹了如何在.NET環境下存取和使用Windows的憑據管理器,包括在UWP和桌面套用中的使用方法。我們還討論了憑據管理器的安全性問題,以及在使用過程中需要註意的事項。如果你在實踐中遇到任何問題,或者有任何疑問,歡迎留言,我會盡快回復你。如果你覺得這篇文章對你有幫助,也歡迎分享給你的朋友。
References
[1]
官方文件:
https://docs.microsoft.com/zh-cn/uwp/api/windows.security.credentials.passwordvault?wt.mc_id=DT-MVP-5005195
[2]
官方文件:
https://docs.microsoft.com/zh-cn/dotnet/standard/native-interop/pinvoke?wt.mc_id=DT-MVP-5005195
[3]
Win32 API 文件:
https://learn.microsoft.com/zh-cn/windows/win32/api/wincred/?wt.mc_id=DT-MVP-5005195