3

我想使用 Http 身份验证获取私人提要中的包列表。这是我的代码,当我调用 ListPlugins 方法时出现 401 错误,我该如何设置凭据?

public  class PluginManager
{
    private readonly string _pluginFolder;
    private readonly IPackageRepository _packageRepository;
    private readonly PackageManager _packageManager;

    public PluginManager(string plugInFolder, string packageRepositoryAddres)
    {
        _pluginFolder = plugInFolder;
        _packageRepository = PackageRepositoryFactory.Default.CreateRepository(packageRepositoryAddres);
        _packageManager = new PackageManager(_packageRepository, _pluginFolder);  
    }

    public IEnumerable<PluginModel> ListPlugins()
    {
        IPackage dummy = null;

        var result =  _packageManager.SourceRepository.GetPackages()
            .OrderBy(p => p.Id)
            .ToList()
            .Select(p => new PluginModel()
            {
                PackageId = p.Id,
                PackageVersion = p.Version.ToString(),
                PackageDescription = p.Description,
                IsInstalled = _packageManager.LocalRepository.TryFindPackage(p.Id, p.Version, out dummy)
            })
            .ToList();

        return result;
    }

    public void Install(string packageId, string packageVersion)
    {
        _packageManager.InstallPackage(packageId, new SemanticVersion(packageVersion));
    }

    public void Uninstall(string packageId, string packageVersion)
    {
        _packageManager.UninstallPackage(packageId, new SemanticVersion(packageVersion));
    }
}
4

1 回答 1

5

一种方法是实现您自己的 ICredentialProvider 或使用 NuGet.Core 中可用的 SettingsCredentialProvider 类,这就是 Visual Studio 和 SharpDevelop 中的 NuGet 的工作方式。设置凭据提供程序将读取 NuGet.config 文件中的所有凭据。

例如,在 SharpDevelop 和 MonoDevelop 中,以下代码使用设置提供程序和自定义提供程序:

    static void InitializeCredentialProvider()
    {
        ISettings settings = Settings.LoadDefaultSettings(null, null, null);
        var packageSourceProvider = new PackageSourceProvider(settings);
        var credentialProvider = new SettingsCredentialProvider(new SharpDevelopCredentialProvider(), packageSourceProvider);

        HttpClient.DefaultCredentialProvider = credentialProvider;
    }

自定义凭据提供程序,至少在 SharpDevelop 中目前什么都不做,在 Visual Studio 中它会提示用户输入他们的凭据。您可以忽略设置提供程序,而只使用自定义凭据提供程序。SharpDevelop 中凭证提供程序的当前实现是:

public class SharpDevelopCredentialProvider : ICredentialProvider
{
    public ICredentials GetCredentials(Uri uri, IWebProxy proxy, CredentialType credentialType, bool retrying)
    {
        return null;
    }
}

因此,您可以从自定义凭据提供程序类中的 GetCredentials 方法返回您的凭据。

需要在 HttpClient 上设置提供程序。您正在使用 PackageRepositoryFactory 类,因此如果您的包源是 url 而不是文件,它将使用 HttpClient。

于 2013-09-03T20:14:46.393 回答