【发布时间】:2014-10-28 01:37:42
【问题描述】:
在我的 WPF 应用程序中,我想允许管理员使用集成安全性为各种其他用户测试数据库连接。所以我有一个表单,允许管理员输入域、用户名和密码,然后进行测试。我能够安全地处理密码,直到我在 advapi32.dll 中调用 LogonUser,这需要 string password
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,但我想在没有纯文本密码的情况下获取它。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
好问题,实际上。但是,如果您真的关心安全性,那么我建议您也考虑非技术性安全漏洞:您的管理员不得也不需要任何关于您用户密码的知识。您正在创建用户名/密码屏幕这一事实表明管理员将输入用户凭据。这对我来说似乎很错误。 (如果不是管理员,而是用户自己,填写他们的凭据,那么首先
RUNAS他们自己登录下的应用程序,你不需要做模拟。) -
原始表单输入字段不会使用常规字符串吗?此外,您可能有兴趣使用我的SimpleImpersonation 库简化您的
LogonUser代码,如here 所述。虽然我也不在那里使用SecureString。 -
@stakx 服务将使用该连接进行连接,因此管理员应该拥有运行该服务的用户的凭据。然而,管理员在配置连接时将在他自己的用户上下文下运行。
-
如果您要模拟的用户未登录机器(例如在另一个会话中),您必须向 LogonUser 提供密码(在堆栈中,在内存中)以进行标准身份验证包。因此,如果您真的想要模拟,则必须在某个地方传递密码。 (如果他在这里登录是一个答案:stackoverflow.com/questions/8304398/…)。否则,请确保您为此使用 postlagerkarte 的示例链接代码。你真的不能做得更多。
标签: c# wpf security impersonation