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