如何使用授权例程提供的VSTS OAuth2承载令牌?

时间:2017-09-28 16:09:43

标签: c# oauth-2.0 azure-devops azure-devops-rest-api

我正在编写一个MVC5 Web应用程序,以便我可以在Visual Studio Team Services(VSTS)中查询我们的工作项。

按照this onethis one之类的教程,我已经成功创建了应用程序,以便它使用我为开发目的创建的个人访问令牌(PAT)来检索我想要的工作项。我还密切关注可用的示例here,成功创建了整个OAuth2进程,以便用户被带到VSTS,要求授权我的应用程序,然后返回到我的回调页面。回调URL正确地包括用户的访问令牌,刷新令牌等。到目前为止,非常好。

我将用户的刷新令牌存储在我的数据库中的用户记录中,以及到期日期和时间(如果他们在访问令牌过期后尝试访问应用程序,我知道刷新令牌)。

我的问题是我无法弄清楚如何在C#代码中为用户而不是我自己的PAT使用访问令牌来查询VSTS。我正在使用的代码如下(它实际上与我在上面链接的GitHub上的示例中的代码相同),并且它工作正常,但正如您可以看到它使用PAT。我如何使用用户的访问令牌,目前我只是在它被API返回时被视为string(可能是错误的?)。

public class GetFeatures
{
    readonly string _uri;
    readonly string _personalAccessToken;
    readonly string _project;

    public GetFeatures()
    {
        _uri = "https://myaccount.visualstudio.com";
        _personalAccessToken = "abc123xyz456"; //Obviously I've redacted my actual PAT
        _project = "My Project";
    }

    public List<VSTSFeatureModel> AllFeatures()
    {
        Uri uri = new Uri(_uri);
        string personalAccessToken = _personalAccessToken;
        string project = _project;

        VssBasicCredential credentials = new VssBasicCredential("", _personalAccessToken);

        //create a wiql object and build our query
        Wiql wiql = new Wiql()
        {
            Query = "Select [State], [Title] " +
                    "From WorkItems " +
                    "Where [Work Item Type] = 'Feature' " +
                    "And [System.TeamProject] = '" + project + "' " +
                    "And [System.State] <> 'Removed' " +
                    "Order By [State] Asc, [Changed Date] Desc"
        };

        //create instance of work item tracking http client
        using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(uri, credentials))
        {
            //execute the query to get the list of work items in the results
            WorkItemQueryResult workItemQueryResult = workItemTrackingHttpClient.QueryByWiqlAsync(wiql).Result;

            //some error handling                
            if (workItemQueryResult.WorkItems.Count() != 0)
            {
                //...do stuff                   
            }

            return null;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您需要使用VssOAuthCredential代替VssBasicCredential

答案 1 :(得分:1)

经过大量的猜测,由于VSTS .NET客户端库记录很少,我发现VssOAuthCredential似乎已被弃用。我能够通过替换

使我的代码示例在上面工作
VssBasicCredential credentials = new VssBasicCredential("", _personalAccessToken)

VssOAuthAccessTokenCredential credentials = new VssOAuthAccessTokenCredential(AccessToken);

其中AccessToken是string,其中包含用户的OAuth访问令牌。

答案 2 :(得分:1)

那个框架似乎没用,哈哈......

我目前正在开发一个备份VSTS帐户的项目,我正在通过HttpRequests对REST API进行所有这些工作。

gaL.getScore()

使用固定登录更容易,不需要Oauth2,但手动执行OAuth2并不困难,只需将令牌转换为承载身份验证标头即可...