SspiPromptForCredentials目标名称

时间:2019-07-08 13:46:38

标签: winapi sspi

我一直在开发使用SSPI进行客户端/服务器身份验证的应用程序。一切正常,但仍然存在一个问题。 SspiPromptForCredentials的第一个参数是目标名称...但是它的真正用途是什么? 我可以从字面上输入任何东西作为目标名称,我的代码将起作用。我什至看不到它写在任何地方(在GUI中)。 与身份验证方法有关吗?我使用“协商”。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

我认为这可能与凭据在凭据管理器中的保存方式有关。

我在MSDN上可以找到的only SspiPromptForCredentials example仅使用一个简单的无用字符串("Target")。

对于CredUIConfirmCredentials MSDN说:

  

指向以空值结尾的字符串的指针,该字符串包含凭据目标的名称,通常是域或服务器应用程序的名称。   该值必须与pszTargetName传递给CredUIPromptForCredentials或CredUICmdLinePromptForCredentials的值相同

CredUICmdLinePromptForCredentials具有类似的参数,为此MSDN说:

  

指向以空值结尾的字符串的指针,该字符串包含凭据目标的名称,通常是服务器名称。

     

pszTargetName参数用于标识目标信息,并用于存储和检索凭证

     

...

     

凭据基于目标名称存储在凭据管理器中。每个目标名称通常尽可能地被存储,而不与已经存储在凭证管理器中的凭证冲突。按目标名称存储凭据的一个重要作用是,特定用户每个凭据中只能存储一个目标。

这些其他CredUI函数可能是较低级别的,但我认为参数用法是相同的。

有关协商的MSDN says this

  

要允许Negotiate选择Kerberos安全提供程序,客户端应用程序必须提供服务主体名称(SPN),用户主体名称(UPN)或NetBIOS帐户名称作为目标名称 。否则,“协商”将始终选择NTLM安全提供程序。

答案 1 :(得分:0)

答案比您想象的要温和一些。 SSPI支持任意凭证类型,因此API需要提供一种提示来提示特定SSP可以理解的凭证,而不必公开第三方API。您无法从SSP本身启动UI,因为它在LSA中运行,因此应用程序构建器和SSP构建器之间存在隐含的约定,即如果您需要特殊的凭据,则必须调用SspiPromptForCredentials

在某些情况下,您尝试使用的SSP可能需要了解目标的信息才能形成封送凭证的形状。通常情况并非如此。

由于您输入的凭据不依赖于目标,因此协商恰好不需要该信息。