NuGet Client SDK - подключение к частному каналу NuGet через код - PullRequest
0 голосов
/ 27 марта 2020

Я использую частный канал NuGet через Azure DevOps.
Чтобы увидеть информацию о publi c пакете NuGet из кода, нужно просто следовать документации здесь . В частности:

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;

SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>();

IEnumerable<IPackageSearchMetadata> packages = await resource.GetMetadataAsync(
    "Newtonsoft.Json",
    includePrerelease: true,
    includeUnlisted: false,
    cache,
    logger,

Я пытаюсь добиться того же результата для своей личной ленты новостей, добавляя свои учетные данные в процесс:

var logger = NullLogger.Instance;
var cancellationToken = CancellationToken.None;

var cache = new SourceCacheContext();    
var source = new PackageSource("*my feed*/nuget/v3/index.json");
source.Credentials = new PackageSourceCredential("*my feed*/nuget/v3/index.json", "*username*", "*password*", true, null);

var repository = Repository.Factory.GetCoreV2(source);
var resource = await repository.GetResourceAsync<PackageMetadataResource>();

IEnumerable<IPackageSearchMetadata> searchMetadata = await resource.GetMetadataAsync(
    "My.Package.Name",
    includePrerelease: true,
    includeUnlisted: false,
    cache,
    logger,
    cancellationToken);

Обратите внимание, что даже если я вызовите Factory.GetCoreV2(), внутри метода все еще вызывается поставщик V3. Это просто единственный конструктор, который принимает PackageSource в качестве параметра:

public static SourceRepository GetCoreV2(this Repository.RepositoryFactory factory, PackageSource source)
{
     return Repository.CreateSource(Repository.Provider.GetCoreV3(), source);
}

Однако, что бы я ни делал, я не могу пройти через шаг

var resource = await repository.GetResourceAsync<PackageMetadataResource>();

, который продолжает сбой с NuGet.Protocol.Core.Types.FatalProtocolException - 401 Unauthorised. Я проверил действительность моих учетных данных и конечной точки канала, а также моих разрешений в канале (полный доступ). Я также попробовал процесс инициализации, описанный здесь (плюс шаг с моими учетными данными), но результат тот же.

Как я должен идентифицировать Azure DevOps канал из кода, чтобы можно было получить информацию IPackageMetadata?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Я вырыл немного глубже, и это кажется возможным, пожалуйста, посмотрите этот Гист с примером реализации https://gist.github.com/cpyfferoen/74092a74b165e85aed5ca1d51973b9d2

1 голос
/ 28 марта 2020

Azure DevOps не поддерживает аутентификацию имени пользователя и пароля через NuGet. Если для вашей учетной записи требуется двухфакторная аутентификация (2FA), NuGet не сможет вас попросить. Я не знаю, решили ли они не поддерживать его для всех учетных записей, даже если они не поддерживают 2FA, или есть и другие причины (подозреваю, что это запрещено по другим причинам безопасности).

Если у вас установлена ​​Visual Studio или иным образом установлен поставщик учетных данных Azure Artifacts NuGet , возможно, вы можете попробовать не использовать какие-либо учетные данные в своем коде. Я не уверен, как именно nuget.exe, tnet cli и msbuild обнаружат провайдер учетных данных, но, возможно, он работает и при использовании sdk.

В противном случае, если вы хотите или должны, используйте API учетных данных, вам нужно сгенерировать персональный токен доступа и использовать его в качестве пароля.

...