小编典典

使用C#从Windows凭据存储中检索凭据

c#

我只想查询凭据存储(或Windows 8中称为 Vault )并获取登录数据。在这种情况下,MSDN确实无济于事,而且我也不希望任何C ++ P /
Invoke
方法。

我知道类似的问题已经在这里问过几次,但是这些解决方案都不适合我。我不使用Metro
App编程,因此PasswordVault(看起来)不可用。我只是创建一个简单的C#WPF桌面应用程序。

理想情况下,它应该可以在多个Windows版本中工作,但是Windows 8是首选。

更具体地说,我想从CRM插件中查询Outlook中存储的数据,以使我的应用程序自动登录到CRM服务器,而无需用户询问他/她的凭据。这意味着,即使有可能…

那么,如何访问Windows凭据存储?


阅读 1082

收藏
2020-05-19

共1个答案

小编典典

我一直在使用一个NuGet库,称为CredentialManagement

用法很简单。我把它包裹了一下,但是我可能不需要:

public static class CredentialUtil
{
    public static UserPass GetCredential(string target)
    {
        var cm = new Credential {Target = target};
        if (!cm.Load())
        {
            return null;
        }

        // UserPass is just a class with two string properties for user and pass
        return new UserPass(cm.Username, cm.Password);
    }

    public static bool SetCredentials(
         string target, string username, string password, PersistanceType persistenceType)
    {
       return new Credential {Target = target,
                              Username = username,
                              Password = password,
                              PersistanceType =  persistenceType}.Save();
    }

    public static bool RemoveCredentials(string target)
    {
        return new Credential { Target = target }.Delete();
    }
}

用法示例:

CredentialUtil.SetCredentials("FOO", "john", "1234", PersistanceType.LocalComputer);
var userpass = CredentialUtil.GetCredential("FOO");
Console.WriteLine($"User: {userpass.Username} Password: {userpass.Password}");
CredentialUtil.RemoveCredentials("FOO");
Debug.Assert(CredentialUtil.GetCredential("FOO") == null);

如果您有兴趣自己实现它,请浏览源代码:http
:
//credentialmanagement.codeplex.com/SourceControl/latest

诀窍是,凭据管理器中没有C#API。该库很好地包装了其他.dll入口点。:-)

2020-05-19