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

我只想查询Credentials Store(或者在Win8中调用的Vault),并获取登录数据。在这种情况下,MSDN真的没有帮助,我也不想要任何C pInvoke方法。

我知道类似的问题在这里已经被问到了几次,但是没有一个解决方案在我的情况下工作。我不使用Metro应用程序编程,所以像PasswordVault这样的东西(看起来)不可用。我只是创建一个简单的C#WPF桌面应用程序。

理想情况下,它应该在几个Windows版本中工作,但Win8是最受欢迎的。

更具体地说,我想从Outlook的CRM插件中查询存储的数据,自动将我的应用程序登录到CRM服务器,而不需要用户要求他的凭据。这意味着,如果这是可能的话

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

有一个Nuget库,我一直在使用称为CredentialManagement
http://nuget.org/packages/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 =  PersistanceType.Enterprise}.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

诀窍是Credential Manager中没有C#API。这个库很好地包装了其他的.dll入口点。

相关文章

文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作...
文章浏览阅读1k次。解决 Windows make command not found 和...
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计...
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是...
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,...
文章浏览阅读1.4w次,点赞5次,收藏22次。如果使用iterator的...