我创建了一个服务帐户来模拟组织中的用户,以便以用户的名义对工作项进行更改。我已经将该服务帐户添加到组“account”中,该帐户已将“代表他人提出请求”设置为“允许”。服务帐户具有Visual订阅。
然后,我使用了我的代码(它与我们的others一起工作)来执行模拟,并且我得到了一个错误500,上面写着“访问被拒绝:x需要以下权限来执行这个操作:代表其他人发出请求”。
我该怎么做才能让它发挥作用?在这里,我使用的代码:
var credential = new VssAadCredential("X@myoganization", "password");
var collection = new TfsTeamProjectCollection(new Uri("my_devops_uri"), credential);
MyTfsConnection.ProjectCollection = collection;
MyTfsConnection.IdentityService = collection.GetService<IIdentityManagementService>();
MyTfsConnection.WIStore = collection.GetService<WorkItemStore>();
var adAccount = "someone@myoganization";
var identity = MyTfsConnection.IdentityService.ReadIdentity(IdentitySearchFactor.AccountName, adAccount, MembershipQuery.None, ReadIdentityOptions.None);
using (var impersonatedCollection = new TfsTeamProjectCollection(new Uri("my_devops_uri"), credential, identity.Descriptor))
{
var impersonatedWIStore = impersonatedCollection.GetService<WorkItemStore>();
}
发布于 2019-09-16 03:30:48
它无法做到这一点,服务帐户不打算将客户端与服务器连接,或者签入代码或更改工作项。
服务帐户用于运行与TFS相关的各种服务。它应该在机器上拥有尽可能少的特权。
客户端不应该用服务帐户连接到服务器,它们应该使用自己的帐户,您可以访问TFS中的相关存储库。例如,如果将所有客户端连接到服务帐户,如何知道谁签入了每个更改集,谁应该将工作项分配给?。
您也将无法将工作项分配到服务帐户。
发布于 2020-11-17 14:59:02
我一直试图将代码迁移到使用模拟来更改其他用户名称中的工作项的DevOps服务。奇怪的是它和你的是多么相似。就好像我们都是从这个关于TFS模拟的旧帖子抓走的。和您的代码一样,这段代码适用于现场DevOps服务器2019.1.1,但我遇到了同样的问题,试图让它使用DevOps服务。
在搜索与TFS / DevOps (SOAP)客户端API和DevOps服务一起工作的答案时,我遇到了引用以下问题的这个问题。
“出于安全原因(以及遵从性和其他一些原因),Visual不支持模拟标头”
我还没有在文档中找到同样的信息。然而,这似乎是真的。在Azure DevOps服务中禁用模拟。德拉特!
没有放弃,我的搜索还从2017年11月发行说明中找到了以下内容,看起来很有希望。
将旁路规则权限授予特定用户 通常,当从另一个源迁移工作项时,组织希望保留工作项的所有原始属性。例如,您可能希望创建一个bug,该bug保留原始创建日期,并由它起源的系统中的值创建。 要更新工作项的API有一个旁路规则标志来启用该场景。以前,发出该API请求的身份必须是Project组的成员。使用此部署,我们在项目级别添加了一个使用旁路规则标志执行API的权限。
但是,我发现在DevOps服务器或DevOps服务的集合/组织或项目权限中没有这样的权限。再来一次!这导致了这就是答案,在这里,工作项更新是直接使用REST在JSON中构建的。因此,旁路规则选项必须仍然有效,只是不能作为可设置的权限公开。
因此,我再次开始查看TFS / DevOps (SOAP)客户端API,并在创建WorkItemStoreFlags.BypassRules
标志时找到传递给WorkItemStore
的标志。以下内容应提供基本的力学知识。
// Use a personal access token with Work Items scope
var credentials = new VssBasicCredential(String.Empty, "Your PAT");
// Connect with TFS / DevOps client libs.
// Older SOAP based client but still works with DevOps Services.
var teamProjectCollection = new TfsTeamProjectCollection(new Uri("https://dev.azure.com/your-org"), credentials);
// Don't use teamProjectCollection.GetService<WorkItemStore>().
// New up WorkItemStore using the collection and explicitly specify the BypassRules flag.
// This allows you to set the CreatedBy field later.
var workItemStore = new WorkItemStore(teamProjectCollection, WorkItemStoreFlags.BypassRules);
// Get the project, work item type, and create the new work item.
var project = workItemStore.Projects["YourProject"];
var workItemType = project.WorkItemTypes["Product Backlog Item"];
var workItem = new WorkItem(workItemType);
// Set the work item fields
workItem.Title = "The Title";
// Without the BypassRules flag the CreatedBy value set here will be ignored on
// Save() and replaced with the user account attached to the PAT used to authenticate.
workItem.Fields[CoreField.CreatedBy].Value = "NotYourUser@yourdomain.com";
workItem.Fields[CoreField.AssignedTo].Value = "NotYourUser@yourdomain.com";
workItem.Save();
https://stackoverflow.com/questions/57918502
复制相似问题