当前位置: 首页 > 知识库问答 >
问题:

将凭据从应用转发到凭据提供商

王长卿
2023-03-14

我已经开始调查凭证提供者是如何工作的,但由于糟糕的文档,我被困在了几个地方。

我有控制台应用程序(有点像ssh服务器),当我远程连接到这个应用程序和认证(没有登录),我希望它能够转发这些凭据凭证提供商,我希望CP登录用户(创建会话)。

我还注意到,在文档中,它说SetSerialization方法总是在SetusageScenario之后被调用。但是我添加了日志,而且SetSerializationSetusageScenario之后永远不会被调用。

正如我所知,当应用程序提供凭据时,会调用Set序列化。我不明白通过申请提供证明是什么意思?似乎这就是我需要的,将凭据从应用程序转发到凭据提供商,但是我怎么做呢?是否有一些函数可以从凭据提供商dll调用以触发登录?

我有没有办法做到这一点?我已经读到,当远程登录完成时,UpdateRemoteCredential被调用,但据我所知(如果我错了,请纠正我),在远程登录中,它意味着RDP,但我的应用程序很简单,它只监听一些端口,获取用户名和密码,然后使用Logonuser函数。

名为MxLogon2的程序实现了这个方案。安装了MxLogon2的远程服务器可以在远程桌面会话中验证连接到客户端的USB密钥(但我需要用户名/密码)。

任何能指引我走正确道路的建议都将不胜感激。

P. S.

我使用pGina作为我的凭据提供程序。

共有1个答案

云瑞
2023-03-14

我不介意在你的情况下进行太多的序列化。这用于预初始化磁贴。

例如,使用RDP连接,您可以在系统上存储凭据证书。此功能用于使用这些凭据预查询磁贴(但不是唯一的解决方案)。

让它在你的情况下返回E_NOTIMPL。

提供程序的主要目的是初始化凭据和磁贴:

    证书初始化

通过SetUsageScenario函数(在提供程序构造后自动调用)完成。在这里,您可以根据所处的场景自定义行为。最基本的是CPU_登录。它应该是这样的(这只是一个预览)

HRESULT Provider::SetUsageScenario(
__in CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
__in DWORD dwFlags
)
{
    HRESULT hr;

    switch(cpus)
    {
        case CPUS_UNLOCK_WORKSTATION:
        case CPUS_LOGON:
        hr = this->_InitCredential();
        break;

        default:
        hr = E_INVALIDARG;
        break;
    }

    return hr;
}

从GetCredentialCount函数开始。它允许您定义要显示的平铺数量(pdwCount out参数),以及要用作默认平铺的平铺数量(pdwDefault)。自动登录也在这里处理(通过pbAutoLogonWithDefault)。

然后在GetCredentialAt函数中开始Tiles枚举。

传递用于身份验证的凭据是在通过GetSeriize函数使用的凭据中完成的。

这里可以找到实现的例子。我几乎不坚持以身作则,因为它很容易根据你想要达到的目标而转移注意力。这是非常灵活的,您最好了解任何函数/参数的用途,以符合您的目标。

EDIT-参见评论:

#define IDCredential        0x1

Credential::Credential(Provider* parent)
{
    //Do ssh connection or whatever

    if(success)
    {
        parent->login = retrievedLogin;
        parent->pwd = retrievedPwd;
        parent->CredentialUsed = IDCredential;
        parent->autoLogin = true;
        parent->ProviderEvents->CredentialsChanged(AdviseContext);
    }
}

HRESULT Provider::GetCredentialCount(
    __out DWORD* pdwCount,
    __out_range(<,*pdwCount) DWORD* pdwDefault,
    __out BOOL* pbAutoLogonWithDefault
    )
{
    if(this->autoLogin && this->CredentialUsed)
    {
        *pbAutoLogonWithDefault = true; // --> Instant call to GetSerialization
        *pdwDefault = this->CredentialUsed; //index of the tile
    }
    else
    {
        *pbAutoLogonWithDefault = false;
        *pdwDefault = IDCredential;
    }

    return S_OK;
}
 类似资料:
  • 在我们的应用程序中,我们使用InstanceProfileCredentialsProvider访问AmazonS3存储桶,但在我们的一些环境中,凭据被弄乱了。 AWS文件(https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-roles.html)内容如下: 如果应用程序使用默认构造函数创建AWS客户端,则客户端将

  • 我已经构建了一个自定义凭据提供程序,它在Windows SDK中作为示例提供。它在计算机上工作得很好。 当CR安装在远程服务器上,人们通过RDP连接到它时,会两次提示用户输入用户名/密码对,第一次是在本机RDP客户端中,第二次是在自定义凭据提供程序本身中,当用户通过本机RDP客户端成功登录时。 有没有办法获取第一步输入的用户名和密码,并将其写入CR字段。

  • 问题内容: 我正在使用Django Rest Framework开发API。我试图列出或创建“订单”对象,但是当我尝试访问控制台时,出现此错误: 观看次数: 序列化器: 我的网址: 然后我在控制台中使用以下命令: 错误说: 问题答案: 通过在我的settings.py中添加“ DEFAULT_AUTHENTICATION_CLASSES”来解决

  • 我已经为MFA开发了一个自定义凭证提供程序,它运行良好。我通过调用REST API在GetSerialization()方法中执行额外的身份验证检查。现在,如果通过REST API成功验证,我允许用户登录。但是对于验证失败的情况,我想显示错误屏幕,就像一个默认的提供者在用户名或密码不正确的情况下显示的那样(有一个“确定”按钮)。我已经了解,如果登录失败,默认情况下,这是在ReportResult(

  • 今天我不得不提交并将代码推入另一个代码中,但我遇到了一些麻烦。 我无能为力,那会再次带来密码输入。 我如何重置系统上的凭据,以便Git向我询问该存储库的密码? null null

  • 我有一个普通的ASP。NET Web应用程序,我使用应用程序服务将其部署到Azure中。在部署它之后,我启用了应用程序服务身份验证并配置了Azure Active Directory。这使我能够发布我的Web应用程序,并具有身份验证,因此只有属于Active Directory的人员才能登录。 另一方面,我部署了一个ASP。NET Web API作为云服务。Web应用程序应该加载一些信息,调用We