首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在凭据提供程序中提交登录

在凭据提供程序中提交登录
EN

Stack Overflow用户
提问于 2018-10-16 11:52:59
回答 3查看 1.4K关注 0票数 1

我读过这个文章来开发我的自定义凭证提供者。

现在,我想测试附在GitHub中的文章中的代码。

  • 我运行install.reg文件。
  • 运行代码并通过更改场景在登录屏幕中显示GUI 私有静态bool IsSupportedScenario(_CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus) {开关(Cpu){ case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_CREDUI:返回true;case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_UNLOCK_WORKSTATION:返回true;case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_LOGON:返回真;大小写_CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_CHANGE_PASSWORD:大小写_CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_PLAP:_CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_INVALID:默认值:返回false;}

问题是如何提交插入的用户名/密码并在正确的情况下成功登录

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-17 09:45:35

我使用这个示例windows-凭据提供程序。如问题中所示,更改使用场景,并在此函数中添加用户名/密码。

代码语言:javascript
复制
public int GetSerialization(out _CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE pcpgsr,
            out _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION pcpcs, out string ppszOptionalStatusText,
            out _CREDENTIAL_PROVIDER_STATUS_ICON pcpsiOptionalStatusIcon)
        {
            Log.LogMethodCall();

            try
            {
                pcpgsr = _CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE.CPGSR_RETURN_CREDENTIAL_FINISHED;
                pcpcs = new _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION();

                var username = "Domain\\username";
                var password = "password";
                var inCredSize = 0;
                var inCredBuffer = Marshal.AllocCoTaskMem(0);

                if (!PInvoke.CredPackAuthenticationBuffer(0, username, password, inCredBuffer, ref inCredSize))
                {
                    Marshal.FreeCoTaskMem(inCredBuffer);
                    inCredBuffer = Marshal.AllocCoTaskMem(inCredSize);

                    if (PInvoke.CredPackAuthenticationBuffer(0, username, password, inCredBuffer, ref inCredSize))
                    {
                        ppszOptionalStatusText = string.Empty;
                        pcpsiOptionalStatusIcon = _CREDENTIAL_PROVIDER_STATUS_ICON.CPSI_SUCCESS;

                        pcpcs.clsidCredentialProvider = Guid.Parse(Constants.CredentialProviderUID);
                        pcpcs.rgbSerialization = inCredBuffer;
                        pcpcs.cbSerialization = (uint)inCredSize;

                        RetrieveNegotiateAuthPackage(out var authPackage);
                        pcpcs.ulAuthenticationPackage = authPackage;

                        return HResultValues.S_OK;
                    }

                    ppszOptionalStatusText = "Failed to pack credentials";
                    pcpsiOptionalStatusIcon = _CREDENTIAL_PROVIDER_STATUS_ICON.CPSI_ERROR;
                    return HResultValues.E_FAIL;
                }
            }
            catch (Exception)
            {
                // In case of any error, do not bring down winlogon
            }
            finally
            {
                shouldAutoLogin = false; // Block auto-login from being stupid
            }

            pcpgsr = _CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE.CPGSR_NO_CREDENTIAL_NOT_FINISHED;
            pcpcs = new _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION();
            ppszOptionalStatusText = string.Empty;
            pcpsiOptionalStatusIcon = _CREDENTIAL_PROVIDER_STATUS_ICON.CPSI_NONE;
            return HResultValues.E_NOTIMPL;
        }

最后,我可以测试.net自定义凭据提供者。

票数 1
EN

Stack Overflow用户

发布于 2018-10-17 08:32:17

你在寻找这个:LogonUser - MSDN吗?

票数 2
EN

Stack Overflow用户

发布于 2019-01-26 20:32:30

这也让我挂了一会儿。但这只是我对认证提供者是如何工作以及如何实现他们的接口的误解。

实际上,你并不是自己“提交”证书。您只需序列化它们,如上面接受的答案所示,方法是填充_CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION,,并负责实际将它们提交给Winlogon.exe

然后,您可以在ReportResult()方法中检查提交的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52834869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档