请理解我缺乏写作技巧。
我正在测试以创建自定义凭据提供程序。
我要创建一个CommandLink
,该按钮使用“提交”按钮执行相同的操作。
我想通过CommandLink
与“提交”按钮分开登录。
当前,只有自定义凭据提供程序通过providerFilter::Filter(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus, DWORD dwFlags, GUID* rgclsidProviders, BOOL* rgbAllow, DWORD cProviders)
公开。
单击[anator longon按钮]登录。
这是我的示例代码:
HRESULT CSampleCredential::CommandLinkClicked(DWORD dwFieldID)
{
HRESULT hr = S_OK;
DWORD dwResult = 0;
if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) &&
(CPFT_COMMAND_LINK == _rgCredProvFieldDescriptors[dwFieldID].cpft))
{
HWND hwndOwner = nullptr;
switch (dwFieldID)
{
case SFI_ANATHOR_SUBMIT_LINK:
dwResult = function_foo();
if(dwResult == 1) {
Call GetSerialization()...?
Run the logon.
}
break;
// ...
}
}
}
答案 0 :(得分:1)
因为您正在编写凭据提供程序,所以您已经在实现ICredentialProvider
接口及其Advise
方法:
virtual HRESULT STDMETHODCALLTYPE Advise(
/* [annotation][in] */
_In_ ICredentialProviderEvents *pcpe,
/* [annotation][in] */
_In_ UINT_PTR upAdviseContext) = 0;
第一个参数是指向事件接口ICredentialProviderEvents
的指针,该事件接口只有一个方法:CredentialsChanged
。
您的任务是从用户(登录名/密码)获取凭据,并将其存储在内部组件中并调用此方法。
在下一个回合中,您的提供者将被称为此方法:
virtual HRESULT STDMETHODCALLTYPE GetCredentialCount(
/* [annotation][out] */
_Out_ DWORD *pdwCount,
/* [annotation][out] */
_Out_ DWORD *pdwDefault,
/* [annotation][out] */
_Out_ BOOL *pbAutoLogonWithDefault) = 0;
您的任务是在pdwDefault
和pbAutoLogonWithDefault
参数中返回正确的值(我的建议是0
和TRUE
)。
与您的类相比,将ICredentialProviderCredential
方法立即调用实现GetSerialization
接口。
在这里您可以返回已经存储的凭据。