CredMartialCredentials 用户名提示(智能卡)

Posted

技术标签:

【中文标题】CredMartialCredentials 用户名提示(智能卡)【英文标题】:CredMartialCredentials username hint (smartcard) 【发布时间】:2017-07-27 16:22:54 【问题描述】:

我正在尝试使用CredMartialCredentialLogonUser 来获取使用智能卡的用户帐户的访问令牌。有两个帐户可以使用智能卡进行身份验证(描述(有点)here)。

通过关注this 源,我能够使其工作一半,但它似乎仅在从映射帐户转换到与证书上的 CN 匹配的帐户时才有效。由于多用户一智能卡设置,卡上没有配置 UPN。

根据this,您必须将LsaLogonUserKERB_CERTIFICATE_LOGON 一起使用,但这两者的文档都很迟钝并且没有示例。我找到了this,但您似乎需要SeTcbPrivilege 才能使用它...我试图实现,但我得到 c000006d:c​​0000321 (STATUS_LOGON_FAILURE, STATUS_SMARTCARD_SUBSYSTEM_FAILURE)

谢谢!

【问题讨论】:

所以您的问题是:“如何实现智能卡登录,其中智能卡在帐户之间共享??”这需要适用于特定的 Windows 版本吗? 基本上,但我想通了。最后一个链接有效,但您需要指定正确的密钥容器。 如果你找到了答案,你会这么好心自己回答这个问题吗?很高兴投票... 【参考方案1】:

在使用同一智能卡密钥对多个用户进行身份验证的情况下使用LsaLogonUser 时,您必须在KERB_CERTIFICATE_LOGON 中提供用户名。我的问题中提供的链接证明了这一点。 如果智能卡上有多个密钥,它将选择第一个,如果那不是用于 Windows 登录的密钥,它将失败。 您必须在 KERB_CERTIFICATE_LOGON 中提供容器名称(也包括在示例中,但留空)。

您还需要将 CSP 名称 (WCHAR szCspName[] = L"IDRIX Generic Cryptographic Service Provider";) 替换为 Microsoft Base Smart Card Crypto Provider

如果您没有SeTcbPrivilege,则可以使用LsaConnectUntrusted(将调用替换为LsaRegisterLogonProcess)。但是,除非您以 Impersonate a client after authentication 权限开始,否则您将无法使用从 LsaLogonUser 获得的令牌执行任何操作。

祝你好运,这个 API 太糟糕了。

【讨论】:

以上是关于CredMartialCredentials 用户名提示(智能卡)的主要内容,如果未能解决你的问题,请参考以下文章

用户管理

电脑超级用户跟普通用户之间怎么切换?

linux用户管理命令

Linux用户和用户组

用户与用户组之用户篇

用户运营中如何杜绝垃圾用户?