我正在寻找一个同时适用于Windows 8.1和Windows 10的想法/解决方案。
对于WPF应用程序中的关键操作,我希望用户再次针对操作系统进行显式身份验证。网络上有许多自定义解决方案,如NuGet包,看起来像是询问用户密码的Windows提示。就像出现的那个一样,如果您试图访问未通过身份验证的网络共享。
我不想使用那些自定义的解决方案,我想使用操作系统提供的解决方案(如果有的话(。
详细地说,我正在寻找类似的东西:
WindowsIdentity identity = WindowsIdentity.GetCurrent();
bool authenticated = [WindowsAPI].Authenticate(identity);
if(authenticated)
{
//do critical action
}
是否存在这样的WindowsAPI?
编辑:WindowsAPI应该有自己的UI,在最好的情况下,它会验证凭据,并且不存储任何凭据。
bool authenticated = [WindowsAPI].Authenticate(identity);
它是否应该要求用户再次输入登录名和密码?
您可以尝试使用Windows API LogoUser。但是,它不提供收集用户名和密码的UI。您可以尝试创建一个包含两个文本框的对话框。
有IPublicClientApplication
和AcquireToken*
两种方法。请检查AcquireToken ByIntegratedWindowsAuth。然而,它可以与AzureAD一起获得代币,所以我不确定它是否符合您的要求。
总体答案是:不,不存在包含自己的UI并额外验证输入凭据的Windows API。
简而言之,我使用了CredUIPromptForWindowsCredentials
,它弹出了一个可配置的操作系统对话框来输入凭据,CredUnPackAuthenticationBuffer
来解包凭据,而LogonUser
来验证解包凭据。最后使用CoTaskMemFree
清除CredUIPromptForWindowsCredentials
分配的内存。
MS文档:
- CredUIPromptForWindowsCredentials
- CredUnPackAuthenticationBuffer
- LogoUser
- CoTaskMemFree
p/Invoke Docs:
- CredUIPromptForWindowsCredentials
- CredUnPackAuthenticationBuffer
- LogoUser
- CoTaskMemFree