我已经在凭证提供商处采用了Widows示例,并使用它们作为参考构建了一个。我可以通过手动输入用户名和密码来无缝登录。我已经设定了
CustomCredential::SetSelected (__out BOOL* pbAutoLogon) {
*pbAutoLogon = TRUE; // FALSE;
return S_OK;
}
现在,选择Tile时,AutoLogon无缝地发生。
作为测试用例,我更改了密码,正如预期的那样,登录失败。失败后,将显示一条错误消息,当我单击“确定”(这是唯一选项)时,将重新提交凭据以进行重试。我们怎么能阻止这种行为?在身份验证失败后调用哪个方法?
我处理了ReportResult()
,但没有帮助。
答案 0 :(得分:0)
已经有一段时间了 - 但我相信调用GetSerialization()会将序列化凭据返回给LogonUI。你也需要实现它。我认为凭证提供者样本有KERB_INTERACTIVE_UNLOCK_LOGON的工作代码。
您还可以在SetSelected()中有条件地更改* pbAutoLogon - 我会在我的凭据提供程序中执行此操作,具体取决于某些结果。
在GetSerialization将其结果返回给LogonUI后,将调用ReportResult()。在ReportResult()中你可以做一些事情,比如清除密码框(在示例代码中完成)。
如果您没有在GetSerialization中返回序列化凭据,那么我认为您可能会遇到原始帖子中列出的错误。在凭证样本中,在GetSerialization()中调用KerbInteractiveUnlockLogonPack(),这就是有效地“记录”用户的内容。
错误似乎是特定的 - “用户未被授予所请求的登录类型”,因此可能与您正在测试的用户的权利有关。
如果您使用的是远程桌面,请确保您的用户是正确群组的成员才能登录(https://support.jumpdesktop.com/hc/en-us/articles/216424183-General-RDP-You-must-be-granted-the-Allow-log-on-through-the-Terminal-or-Remote-Desktop-Services-Right-),或者如果是普通用户,则允许其进行交互式登录。
另外 - SetSelected()在你的凭据提供者被点击时被调用 - 我不确定它是否在每次登录尝试后被调用(我的猜测是它没有。)在我的凭证提供者中我是使用我使用SetSelected()显示的自定义登录对话框。