代码之家  ›  专栏  ›  技术社区  ›  user1336827

安全windows模拟?

  •  13
  • user1336827  · 技术社区  · 11 年前

    在我的WPF应用程序中,我希望允许管理员使用集成的安全性来测试其他用户的数据库连接。所以我有一个表单,允许管理员输入域、用户名和密码,然后进行测试。我可以安全地处理密码,直到我打电话 LogonUser advapi32.dll 这需要 string password

    LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)
    

    我编写了一个实用程序函数,将SecureString转换为尽可能安全的字符串,然后我在LogoUser调用中使用密码调用它:

    LogonUser(UserName, Domain, Helper.ConvertSafely(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle)
    

    由于LogonUser的签名采用字符串,除非LogonUser在执行过程中正确处理密码,否则在调用返回后,它仍可能以纯文本形式出现在我的调用堆栈中。是否有一种更安全的方式来模拟用户,在这种方式中,我可以一直信任PW是安全的?

    基本上我只需要一个 WindowsImpersonationContext 但我想在没有明文密码的情况下获取它。

    3 回复  |  直到 11 年前
        1
  •  6
  •   Postlagerkarte    11 年前

    在托管应用程序中,您可以使用SecureString类来处理敏感信息。通常不需要滚动自己的安全字符串机制。

    就在您插入LogoUser之前,您将传递的非托管副本 SecureString密码。您使用 Marshal.SecureStringToGlobalAllocUnicode 方法。因此,在您的应用程序域中永远没有表示密码的托管对象。

    您可以在中找到示例代码 this 文章

    如果您需要更多的安全性,我建议您禁止wpf客户端的直接数据库连接。你可以引入中间层。因此,安全性从客户端转移到这一服务器。客户端和应用服务器之间的通信是加密的,只有应用服务器与数据库通信。

        2
  •  4
  •   Community Mohan Dere    8 年前

    如果您要模拟的用户已经登录到计算机上(例如在另一个会话中),下面是答案: Is it possible for a Windows service impersonate a user without a password?

    如果他没有,你必须向LogoUser提供密码。该密码必须至少在内存中驻留一小段时间,因为这是LogoUser的定义方式。请注意,并非所有身份验证包都需要密码(如生物识别或智能卡: Windows Authentication Overview ).

    所以,如果你真的想要模拟,你必须在某处传递密码。在这种情况下,请确保使用来自Microsoft的postlagerkarte代码: Marshal.SecureStringToGlobalAllocUnicode Method sample code

    你真的做不了太多了。

        3
  •  1
  •   Greg    11 年前

    更新:

    您可以实现加密 app.config 。您可以通过几种不同的方法来做到这一点:

    因此,当管理员插入要解密 应用程序配置文件 修改 键/值 使用新凭据。然后,一旦它被插入,它将再次加密配置文件。

    因此,它被暴露得最少,但数据也通过封装插入,这也有助于隐藏它。

    这是一种方法,尽管 SecureString 将工作它期望 char[] 。在某些情况下,通过 advapi32.dll .