TFS 2015 u2。尝试编写一个TFS扩展,该扩展将使用JavaScript API来操纵发布定义的安全性。与安全相关的API失败,错误401.代码为:
scopes
401未经授权的错误。据我所知,扩展可能使用的REST API列表由清单中的item_name_MyItem1=Nice Title
item_desc_MyItem1=A short description
参数驱动。我在那里放置什么才能工作? The scopes list没有列出任何类型。
同时,使用Windows身份验证从常规REST客户端调用相同的端点可以按预期工作。
答案 0 :(得分:2)
在TFS 2017 u2中,最后有 vso.security_manage 。
在TFS 2017 u1中,范围vso.base
涵盖此API端点,但仅限于GET。 POST,这是更改描述符所必需的,仍然不在范围内。
在TFS 2015 u2中,可能在下面,没有涵盖ACL相关端点的范围。
我发现了一种非常的hackish方式,可以在旧版本的TFS中为OAuth启用这些端点。它仅适用于本地TFS。 OAuth范围与服务端点URL /方法之间的关系存储在全局,公共,可变单一数据结构中,一个用户代码可能只能更改。如果你在CreateDefault
内的Microsoft.VisualStudio.Services.DelegatedAuthorization.AuthorizationScopeDefinitions
课程中找到方法Microsoft.TeamFoundation.Framework.Server.dll
,你可以在你最喜欢的MSIL反汇编程序(ILDASM,ILSpy,Reflector)中看到它。
以下Global.asax可以解决问题。您必须将其复制到C:\Program Files\Microsoft Team Foundation Server 14.0\Application Tier\Web Services
(针对TFS 2015)。
<%@ Application Inherits="Microsoft.TeamFoundation.Server.Core.TeamFoundationApplication" %>
<%@ Import namespace="Microsoft.VisualStudio.Services.DelegatedAuthorization" %>
<%@ Import namespace="System.Collections.Generic" %>
<%@ Import namespace="System.Linq" %>
<script runat="server">
void Session_Start(object o, EventArgs a)
{
AuthorizationScopeDefinition Def = AuthorizationScopeDefinitions.Default.scopes
.FirstOrDefault(d => d.scope == "vso.identity");
if(Array.IndexOf(Def.patterns, "/_apis/SecurityNamespaces#GET") < 0)
{
List<string> l = Def.patterns.ToList();
l.Add("/_apis/SecurityNamespaces#GET");
l.Add("/_apis/AccessControlLists#GET+POST");
l.Add("/DefaultCollection/_apis/SecurityNamespaces#GET");
l.Add("/DefaultCollection/_apis/AccessControlLists#GET+POST");
Def.patterns = l.ToArray();
}
}
</script>
挂钩Application_Start会更有意义,但代码隐藏DLL已经挂钩了它。 Global.asax中的另一个处理程序不会覆盖。我对vso.identity
范围进行了修补,因为我的扩展程序已经声明了这一点,但可以随意使用其他任何一个。
介绍您自己的全新范围可能无效。
答案 1 :(得分:0)
不幸的是,没有任何REST API可以更改发布定义或发布环境的权限。
您可以投票使用用户声音。 REST API for release defintion or release enviornment TFS PM将审核您的建议。