我读过这个文章来开发我的自定义凭证提供者。
现在,我想测试附在GitHub中的文章中的代码。
问题是如何提交插入的用户名/密码并在正确的情况下成功登录
发布于 2018-10-17 09:45:35
我使用这个示例windows-凭据提供程序。如问题中所示,更改使用场景,并在此函数中添加用户名/密码。
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自定义凭据提供者。
发布于 2018-10-17 08:32:17
你在寻找这个:LogonUser - MSDN吗?
发布于 2019-01-26 20:32:30
这也让我挂了一会儿。但这只是我对认证提供者是如何工作以及如何实现他们的接口的误解。
实际上,你并不是自己“提交”证书。您只需序列化它们,如上面接受的答案所示,方法是填充_CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION,,并负责实际将它们提交给Winlogon.exe
然后,您可以在ReportResult()方法中检查提交的结果。
https://stackoverflow.com/questions/52834869
复制相似问题