使用安全性如何LOGON32_LOGON_NETWORK_CLEARTEXT http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184%28v=vs.85%29.aspx?
我们有以下场景:
Web 服务器 A 使用 Win32 LogonUser。然后它需要调用服务器B上的asmx方法。
如果使用的登录类型是 LOGON32_LOGON_INTERACTIVE,则效果很好。然而,客户拒绝了这一点,因为它需要交互式访问。
如果我们使用 LOGON32_LOGON_NETWORK,则不允许将令牌委托给远程服务器,我们会得到 401(正如预期的那样,根据 MSDN)。
尝试使用 DuplicateToken 将令牌“升级”为交互式失败。此尝试基于这篇文章,其中指出:
“当您请求交互式登录时,LogonUser 返回一个主
允许您在模拟时创建进程的令牌。什么时候
您请求网络登录,LogonUser 返回一个模拟令牌
可用于访问本地资源,但不能创建
流程。如果需要,您可以将模拟令牌转换为
通过调用 Win32 DuplicateToken 函数的主令牌."
但似乎如果我们使用 LOGON32_LOGON_NETWORK_CLEARTEXT 如所述这个旧线程 http://www.derkeiler.com/Newsgroups/microsoft.public.dotnet.framework.aspnet.security/2002-09/1146.html,代表团工作。但它的使用安全性如何?根据 MSDN:
“此登录类型在身份验证中保留名称和密码
包,允许服务器连接到其他网络
服务器同时冒充客户端。服务器可以接受明文
来自客户端的凭据,调用 LogonUser,验证用户可以
通过网络访问系统,并仍然与其他人通信
服务器。”
以这种格式使用的凭据是否对嗅探器可见(我们使用 Windows 集成安全性,有时使用 SSL,但并非总是如此)。
请指教。
我有同样的问题,虽然我还没有找到明确的答案,但我已经做了一些调查和阅读,这是我的结论(欢迎更正):
理想/最安全的用例是如果您的代码看起来像这样的伪代码:
success = LogonUser(username, domain, password,
LOGON32_LOGON_NETWORK_CLEARTEXT, provider, out token)
if (success) {
StartImpersonation(token)
remoteConnection = AuthenticateToRemoteServer()
StopImpersonation()
CloseHandle(token)
// continue to use remoteConnection
}
当您关闭其句柄时,与 LogonUser 会话关联的明文凭据将被销毁(我还没有找到这方面的参考,但对我来说,它们不会这样做是没有意义的)。因此,在令牌的生命周期内,存在用户凭据的副本,并用于对远程服务器进行身份验证。但是您的应用程序已经在内存中以明文形式提供了凭证(在变量中)username
, domain
and password
)所以这并不会真正带来额外的安全风险。
使用 Windows 身份验证的远程服务器的任何身份验证都将使用 NTML 或 Kerberos,并且这两种协议都不会在线发送凭据,因此这不是问题。我不能肯定地说如果远程服务器要求基本身份验证会发生什么,但我认为它更有可能失败,而不是发送您的凭据。
如果您需要将令牌保留更长时间,文档确实指出凭据以明文形式存储在(某处)。我转储了测试进程,但无法在转储文件中找到它们,所以我不知道这是否意味着它们存储在内核内存中或什么中。如果我必须长期保留这个令牌,我会有点担心。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)