отправить вход в поставщика учетных данных

Я прочитал эту статью, чтобы разработать моего собственного поставщика учетных данных.

Теперь я хочу протестировать код, прикрепленный к статье, на GitHub.

  • Я запускаю
    #P3#
  • запустите код и покажите графический интерфейс на экране входа в систему по сценарию изменения

     private static bool IsSupportedScenario(_CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus)
    
         {
    
           switch (cpus)
            {
    
             case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_CREDUI:
                return true;
    
            case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_UNLOCK_WORKSTATION:
                return true;
    
            case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_LOGON:
                return true;
            case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_CHANGE_PASSWORD:
            case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_PLAP:
            case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_INVALID:
            default:
                return false;
        }
    }
    

вопрос в том, как я могу отправить вставленное имя пользователя/пароль и успешно войти в систему, если он правильный


person Mohamed Ahmed Sayed    schedule 16.10.2018    source источник


Ответы (3)



Я использую этот образец windows-credentials-provider. Измените сценарии использования, как указано выше в вопросе, и укажите имя пользователя/пароль в этой функции.

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.

person Mohamed Ahmed Sayed    schedule 17.10.2018

Меня это тоже какое-то время подвешивало. Но это было просто мое непонимание того, как работают поставщики учетных данных и как реализовать их интерфейсы.

На самом деле вы не «отправляете» учетные данные самостоятельно. Вы просто сериализуете их, как показано в принятом ответе выше, заполняя _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION, и Windows позаботится о том, чтобы фактически отправить их в Winlogon.exe.

Затем вы можете проверить результат отправки в методе ReportResult().

person Dbloom    schedule 26.01.2019