CredMartialCredentials 用户名提示(智能卡)
Posted
技术标签:
【中文标题】CredMartialCredentials 用户名提示(智能卡)【英文标题】:CredMartialCredentials username hint (smartcard) 【发布时间】:2017-07-27 16:22:54 【问题描述】:我正在尝试使用CredMartialCredential
和LogonUser
来获取使用智能卡的用户帐户的访问令牌。有两个帐户可以使用智能卡进行身份验证(描述(有点)here)。
通过关注this 源,我能够使其工作一半,但它似乎仅在从映射帐户转换到与证书上的 CN 匹配的帐户时才有效。由于多用户一智能卡设置,卡上没有配置 UPN。
根据this,您必须将LsaLogonUser
与KERB_CERTIFICATE_LOGON
一起使用,但这两者的文档都很迟钝并且没有示例。我找到了this,但您似乎需要SeTcbPrivilege
才能使用它...我试图实现,但我得到 c000006d:c0000321 (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 用户名提示(智能卡)的主要内容,如果未能解决你的问题,请参考以下文章