TFS API—如何只返回经过身份验证的用户具有权限的项目,而不是整个列表

本文关键字:项目 权限 列表 用户 API 返回 TFS 身份验证 经过 | 更新日期: 2023-09-27 18:01:33

我目前正在使用api从TFS返回一个项目列表。

var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("some URI"));
var store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
var projects = store.Projects

这很好。但是,它返回每个用户的TFS团队项目的完整列表。是否有一种方法可以返回或过滤列表,以便只返回特定用户可以访问的项目?

TFS API—如何只返回经过身份验证的用户具有权限的项目,而不是整个列表

在TFS 2010中,我相信您可以通过在调用时模拟您感兴趣的用户来实现这一点。

TFS 2010 API允许(经过适当授权的)应用程序"冒充"任何您想要的有效用户并以该用户的身份执行操作。这是"授权"模拟——您不是作为另一个用户进行身份验证,因此不需要输入密码,但是您"代表"另一个用户执行操作。你需要有一个特定的权限才能做到这一点,所以你的应用程序需要实际上作为具有"代表其他用户发出请求"权限的用户运行。

完成之后,代码就非常简单了。您从TPC中提取所需的身份,然后在不同的上下文中创建第二个"模拟"身份,并将第二个上下文用于您的实际工作:

var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("some URI"));
var identityService = tfs.GetService<IIdentityManagementService>();
var identity = identity = identityService.ReadIdentity(
        IdentitySearchFactor.AccountName,
        "someuser", 
        MembershipQuery.None, 
        ReadIdentityOptions.None);
var userTfs = new TfsTeamProjectCollection(tfs.Uri, identity.Descriptor);

您对userTfs采取的任何操作都将按照指定的用户名执行;这允许您代表其他用户查询项目,队列构建等。

如果您添加了using System.net,那么您可以使用凭据缓存,并在获取集合时将当前用户的默认凭据传递给TFS

using (var tfs = new TfsTeamProjectCollection(tfsUri, CredentialCache.DefaultCredentials))
            {
                var store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
                var projects = store.Projects                
            }