Я разрабатываю расширение Visual Studio (проект VSIX), которому необходимо управлять пакетами Nuget для данного проекта.
Я уже использую сервис IVsPackageInstaller
, так как задокументировано здесь но это ограничено, и мне нужно больше функций (например, получить номер последней версии данного пакета).
Я искал, но не нашел ничего о том, как программно взаимодействовать с диспетчером пакетов Visual Studio, поэтомуЯ решил использовать API Nuget напрямую.
Я отправляю HTTP-запросы к API Nuget, используя класс WebRequest
(потому что мы не можем использовать HttpClient
в проекте VSIX), но я нажимаюпроблема: запросы отправляются на частный канал Nuget, который требует аутентификации!(размещено в Azure DevOps)
Я использовал Fiddler для проверки HTTP-запросов, отправленных на наш сервер Azure DevOps.Я вижу POST-запрос, идущий на https://app.vssps.visualstudio.com/_apis/Token/SessionTokens
с токеном в ответе, но это не токен, который я ищу.
Токен, переданный в API Nuget, - это токен Basic
, полученный от Я не знаю, где.Я не смог найти этот токен в HTTP-ответах, которые я перехватил.
Я также вижу, что некоторые ответы на наш сервер DevOps Azure содержат такие заголовки (я изменил GUID)
WWW-Authenticate: Bearer authorization_uri=https://login.windows.net/ce372fcc-5e17-490b-ad99-47565dac8a84
Я могу найти этот GUID обратно в файле %userprofile%\AppData\Local\.IdentityService\AccountStore.json
, здесь определенно что-то происходит.И файл SessionTokens.json
в той же папке тоже выглядит интересно, но он зашифрован ...
Я также попытался покопаться в реестре, чтобы посмотреть, могу ли я найти интересную информацию, например, по пути, указанному в Комментарий Саймона , но, похоже, VS2017 больше не хранит токен там.
Я также загрузил файл privateregistry.bin
(он же Visual Studio Settings Store
) и искал везде, но ничего не смог найти.
Таким образом, вместо попытки перепроектировать Visual Studio, я хотел получить прямой доступ к провайдеру учетных данных.Я попытался получить доступ к нескольким службам и классам
var componentModel = await ServiceProvider.GetGlobalServiceAsync(typeof(SComponentModel)) as IComponentModel;
var credentialProvider = componentModel.GetService<IVsCredentialProvider>();
var credentialServiceProvider = componentModel.GetService<ICredentialServiceProvider>();
var defaultCredentialServiceProvider = new DefaultVSCredentialServiceProvider();
, но ни один из них не работает (возвращает ноль или исключение).
Я забрел в NuGet.PackageManagement.VisualStudio *Проект 1043 * на Github, но не смог найти мой ответ.
Существует также множество пакетов Nuget, таких как NuGet.PackageManagement.VisualStudio
, Microsoft.VisualStudio.Services.Release.Client
, Microsoft.VisualStudio.Services.ExtensionManagement.WebApi
, Microsoft.VisualStudio.Services.InteractiveClient
, и это лишь некоторые из них, но, честно говоря, я не знаю, есть ли то, что я ищу...
Так как получить доступ к учетным данным Nuget, используемым в Visual Studio?
Я использую любое решение, которое дает мне доступ ко всем функциям чтения Nuget, например, программно использует управление пакетами Visual Studio, или расшифровывает этот SessionTokens.json
файл, или обращается к поставщику учетных данных Visual Studio.
Чем меньше хаки является ответом, тем лучше.
На данный момент вы, наверное, уже догадались, я не хочу хранить username
и password
где-то сам.Мне нужно создать удобное расширение VS, поэтому я хочу получить и использовать учетные данные, уже сохраненные в Visual Studio пользователями.
Большое спасибо за решение этой проблемы.