【发布时间】:2019-10-12 12:03:52
【问题描述】:
我使用来自 VistaCredentialProviderSamples 的 SampleWrapExistingCredentialProvider 开发了一个自定义凭据提供程序。凭据提供程序实现了一个过滤器,用于过滤所有其他凭据提供程序,我在登录时只看到我的凭据提供程序。问题是,如果我们使用远程桌面连接连接到它,用户名/密码不会从 Windows RDP 客户端传递到凭据提供程序,当 RDP 会话打开时我必须再次输入它(与默认提供程序的行为不同)
我正在尝试探索代码的哪一部分处理凭据提供程序从远程桌面客户端接受用户名/密码并且不再询问的情况。附件是在 RDP 客户端上提供成功凭据后我的凭据提供程序的屏幕截图。单击凭据提供程序的此图标后,将显示凭据提供程序磁贴,该磁贴再次询问用户名和密码。任何有关如何从 RDP 客户端接收凭据的帮助将不胜感激。
我已为 CREDUI 返回 S_OK。我的 SetUsageScenario 如下:
HRESULT CSampleProvider::SetUsageScenario(
CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
DWORD dwFlags
)
{
HRESULT hr;
// Create the password credential provider and query its interface for an
// ICredentialProvider we can use. Once it's up and running, ask it about the
// usage scenario being provided.
IUnknown *pUnknown = NULL;
hr = ::CoCreateInstance(CLSID_PasswordCredentialProvider, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pUnknown));
if (SUCCEEDED(hr))
{
hr = pUnknown->QueryInterface(IID_PPV_ARGS(&(_pWrappedProvider)));
if (SUCCEEDED(hr))
{
hr = _pWrappedProvider->SetUsageScenario(cpus, dwFlags);
switch (cpus)
{
case CPUS_LOGON:
case CPUS_UNLOCK_WORKSTATION:
case CPUS_CREDUI:
{
hr = S_OK;
break;
}
case CPUS_CHANGE_PASSWORD:
default:
hr = E_INVALIDARG;
break;
}
}
}
if (FAILED(hr))
{
if (_pWrappedProvider != NULL)
{
_pWrappedProvider->Release();
_pWrappedProvider = NULL;
}
}
return hr;
}
【问题讨论】:
-
在 RDP 客户端上,凭据提供程序反复询问用户名和密码,即使您已成功输入?
-
@StriveSun-MSFT 不,它不会在 RDP 客户端上重复询问。 RDP 客户端成功验证并打开会话,但在会话内部,我留在登录屏幕,让 Windows 再次输入凭据
-
正如我在回答中所说,如果用户连接的是非 Microsoft 凭据提供程序,那么终端服务器上会提示您再次输入凭据(两次)。
-
@StriveSun-MSFT 是的,我读过它,但我有些困惑,我记得我曾在一个组织中看到过一个 OTP CP,其中 RDP 会话仅在验证来自 RDP 客户端的凭据后才要求 OTP 并且确实不再要求用户名和密码。如果用户输入正确的 OTP,则用户已登录。他们为什么会这样做?
-
对于 RDP,您根本不需要实现
CREDUI。但您需要正确实施UpdateRemoteCredential和SetSerialization方法。很明显,您在其中一个(或两个)实现中犯了错误。 * 过滤器实现过滤所有其他凭据提供程序* - 您需要将UpdateRemoteCredential中的pcpcsOut->clsidCredentialProvider更改为 your clsid 提供程序 - 这是关键点,否则将不会调用SetSerialization(因为你禁用了原来的 clsid)并且在SetSerialization需要恢复原来的clsidCredentialProvider之前将它传递给原来的
标签: c++ windows winapi remote-desktop credential-providers