visual-studio - 如何获取缓存在注册表中的 Visual Studio Online 凭据?

标签 visual-studio tfs visual-studio-2013 tfsbuild azure-devops

当您登录 Visual Studio 2013 时,它会在注册表中缓存您的个人资料和凭据:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\ConnectedUser\IdeUser\Cache
HKEY_CURRENT_USER\Software\Microsoft\VSCommon\12.0\ClientServices\TokenStorage\VisualStudio\IdeUser

当您使用 TFS API 通过 Visual Studio Online 进行身份验证时,它会将凭据复制到:

HKEY_CURRENT_USER\Software\Microsoft\VSCommon\12.0\ClientServices\TokenStorage\VisualStudio\VssApp

use tfs = new TfsTeamProjectCollection(Uri "https://ctaggart.visualstudio.com/DefaultCollection")
tfs.Authenticate()

如何使用 Visual Studio 或 TFS API 在 C# 或 F# 中使用这些值?

我推测 Vss 可能意味着 Visual Studio 服务。有一个 Microsoft.VisualStudio.Services.Common。 CredentialsCacheManager另一个在 Microsoft.TeamFoundation.Client 中,但我不知道如何使用。它有 ContainCredentials、GetCredentials 和 DeleteCredentials,因此看起来很有前途。 GetCredentials 返回 TfsCredentialCacheEntry ,它有一个 Credentials 属性来获取 System.Net.NetworkCredential,这正是我正在寻找的。

我不知道如何使用 CredentialsCacheManager,但这是我尝试过的。

let ccm = Microsoft.TeamFoundation.Client.CredentialsCacheManager(@"Software\Microsoft\VSCommon\12.0\ClientServices\TokenStorage\VisualStudio", false)
ccm.ContainsCredentials("IdeUser", Uri "ideuser:https://app.vssps.visualstudio.com:vssuser:federated")

使用 Process Monitor,它显示 CredentialsCacheManager 要么不是我正在寻找的,要么我不知道如何使用它:

Process Monitor of Code

最佳答案

我明白了。 Microsoft.TeamFoundation.Client.TfsClientCredentialStorage 有我正在寻找的东西。我把所有的example code in a F# script as a gist 。我也将其复制到这里:

#r "Microsoft.TeamFoundation.Client"
#r "Microsoft.VisualStudio.Services.Common"
#r "System.Net.Http"

open System
open Microsoft.TeamFoundation.Client

// retrieve VssToken

// for the logged in user "IdeUser"
let vssTokenIdeUser = TfsClientCredentialStorage.RetrieveConnectedUserToken()

let tokenStorage = Microsoft.VisualStudio.Services.Common.TokenStorage.VssTokenStorageFactory.GetTokenStorageNamespace "VisualStudio"
let vssTokens = tokenStorage.RetrieveAll "VssApp" |> Array.ofSeq
for t in vssTokens do
    printfn "%s %s %s %s" t.Resource t.Type (t.GetProperty "UserId") (t.GetProperty "UserName")

// create a TfsClientCredentials by retrieving an IssuedToken

let ccs = TfsClientCredentialStorage()
let ct = ccs.RetrieveToken(Uri "https://ctaggart.visualstudio.com", Microsoft.VisualStudio.Services.Common.VssCredentialsType.Federated) :?> CookieToken
let cc = CookieCredential(false, ct)
let tcc = TfsClientCredentials cc

// use the TfsClientCredentials to authenticate with 

let tfs = new TfsTeamProjectCollection(Uri "https://ctaggart.visualstudio.com/DefaultCollection", tcc)
tfs.Authenticate()

关于visual-studio - 如何获取缓存在注册表中的 Visual Studio Online 凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20809207/

相关文章:

visual-studio - 从命令行禁用 msvsmon 超时

visual-studio-2012 - 将 TF.exe 与 Team Foundation Service 一起使用?

c - Visual Studio 2013 : Access violation when attempt to change value of variable obtained from LockResource()

c++ - 特征行 vector 超出范围会产生 “Run-Time Check Failure #2 - Stack around the variable X was corrupted”

visual-studio - 有没有办法让 ReSharper 不格式化代码区域

git - 为什么我在尝试将 git 与 VS Code 结合使用时不断收到 "Permission Denied: (Public Key)"错误?

.net-4.0 - 如何将标记化参数添加到 web.config 文件中,以便它显示在 SetParameters.xml 中?

visual-studio - Visual Studio 11 电动工具 checkin 策略

c# - Visual Studio 团队服务 : Build Error (Assembly reference cannot be resolved)

servicestack - 使用 VS2013 和 ServiceStack.Client 包 v.4.0.3 缺少命名空间 ServiceClient (ServiceStack.ServiceClient.Web)