[英]Secure windows Impersonation?
在我的WPF应用程序中,我希望允许管理员使用集成安全性为各种其他用户测试数据库连接。 所以我有一个表单,允许管理员输入域名,用户名和密码,然后测试它。 我能够安全地处理密码,直到我在带有string password
的advapi32.dll
调用LogonUser
LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)
我编写了一个实用程序函数,它将SecureString转换为尽可能安全的字符串,然后在LogonUser调用中将其调用密码:
LogonUser(UserName, Domain, Helper.ConvertSafely(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)
由于LogonUser的签名采用字符串,除非LogonUser在执行时正确地处理密码,否则在调用返回后它仍然可以在我的调用堆栈中以纯文本形式存在。 是否有一种更安全的方式来冒充用户,在这种情况下,我可以确信PW一直是安全的?
基本上我只需要一个WindowsImpersonationContext
但我想在没有密码的情况下查询它。
在托管应用程序中,您可以使用SecureString类来处理敏感信息。 通常不需要滚动自己的安全字符串机制。
在您进入LogonUser之前,您将传递SecureString密码的非托管副本。 您可以使用Marshal.SecureStringToGlobalAllocUnicode
方法。 因此,您的应用程序域中永远不会有代表密码的托管对象。
您可以在示例代码此文章。
如果您需要更高的安全性,我建议您禁止从您的wpf客户端直接连接数据库。 您可以引入中间层。 因此,安全性从客户端转移到这个服务器。 客户端和App-Server之间的通信已加密,只有应用服务器与数据库通信。
如果您要模拟的用户已登录到计算机上(例如在另一个会话中),则可以回答: Windows服务是否可以在没有密码的情况下模拟用户?
如果他不是,你将不得不为LogonUser提供密码。 此密码必须至少驻留在内存中,因为这是LogonUser的定义方式。 请注意,并非所有身份验证包都需要密码(如生物识别或智能卡: Windows身份验证概述 )。
因此,如果您真的想要模仿,那么您必须在某处传递密码。 在这种情况下,请确保使用Microsoft的postlagerkarte代码: Marshal.SecureStringToGlobalAllocUnicode方法示例代码
你真的不能做得更多。
更新:
您可以实现加密的app.config
。 您可以通过几种不同的方法来实现:
那么这是如何工作的,当管理员插入您将解密app.config
的凭据时,使用新凭据修改密钥/值 。 然后一旦插入它再次加密配置文件。
所以它暴露的最低限度,但数据也通过封装插入,这也有助于隐藏它。
这是一种方法,虽然SecureString
可以使用它需要char[]
。 在某些情况下,在通过advapi32.dll
接口时可能并不理想。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.