Azure DevOps Services
Azure DevOps Services 支持专用项目和公共项目。 专用项目限制对具有显式权限的经过身份验证的用户的访问。 公共项目允许非成员用户以只读状态查看项目内容。
非成员用户可以是:
- 匿名:未向 Azure DevOps Services 进行身份验证
- 公共:已向 Azure DevOps Services 进行身份验证,但不是组织成员
** 非成员用户看到的视图与经过身份验证的用户相同,但 Azure DevOps 会隐藏或禁用非公共功能,例如设置、操作和生成队列操作。
重要
只有已启用 “允许公共项目策略 ”的组织才能创建项目或更改项目的可见性。 策略不再可供尚未使用它的组织使用。 Microsoft建议为所有公共项目需求使用 GitHub 。
决定是否使扩展对非成员用户可见
作为扩展开发人员,可以向非成员用户提供扩展的全部或部分功能。 这些用户只能在公共项目中使用您的扩展。 如果选择不向非成员用户提供扩展,则无需进行任何更改,并且该决定不会影响公共项目中使用扩展的成员。
使用此清单来帮助确定是否应将扩展提供给非成员用户:
- 扩展程序提供与非成员用户相关的数据
- 您的扩展在项目级别提供功能
- 你的扩展有助于非成员用户可以访问的产品区域
- 您的扩展不会依赖非成员用户无法访问的功能,例如扩展数据服务或某些 Azure DevOps Services 的 REST API。 有关详细信息,请参阅 “限制 ”部分。
配置贡献可见性
默认情况下,Azure DevOps 仅显示对组织成员的贡献。 若要为非成员用户提供参与的可见性,请设置 restrictedTo 该贡献的属性。 该值是一个字符串数组,其中列出了哪些用户类型应看到贡献。 可能的值包括:
-
member:作为组织成员的经过身份验证的用户 -
public:经过身份验证的用户不是组织成员 -
anonymous:未经身份验证的用户
使中心对匿名用户、公共用户和成员用户可见
{
"contributions": [
{
"id": "my-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-code-web.code-hub-group"
],
"restrictedTo": [
"member",
"public",
"anonymous"
],
"properties": {
...
}
}
]
}
还可以通过在扩展清单的根目录中设置属性,为扩展中的所有贡献设置 restrictedTo 默认可见性。 您可以在单个贡献上替代此默认值。
除了一项贡献不对所有用户可见,其他贡献都对所有用户可见
{
"id:": "my-extension",
"name": "My Extension",
"version": "1.0.0",
...
"restrictedTo": [
"anonymous",
"public",
"member"
],
"contributions": [
{
"id": "my-member-only-widget",
"type": "ms.vss-dashboards-web.widget",
"restrictedTo": [
"member"
],
"properties": {
...
}
},
{
"id": "my-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-code-web.code-hub-group"
],
"properties": {
...
}
},
{
"id": "my-second-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-work-web.work-hub-group"
],
"properties": {
...
}
}
]
}
了解非成员用户的限制
如果想要为公共用户提供贡献的某些或所有方面,请考虑以下限制。
VSS SDK 方法限制
核心 SDK 脚本 VSS.SDK.js使 Web 扩展能够与父帧通信,以执行初始化通信和获取当前用户上下文信息等作。 以下 VSS SDK 方法不支持非成员用户:
VSS.getAccessToken()VSS.getAppToken()
扩展数据服务限制
由于 扩展数据服务 管理未限定或保护到项目的数据,因此非成员用户无法读取或写入任何类型的扩展数据。
处理数据访问错误
当数据服务由于调用用户的权限限制而无法访问数据时,从调用 getValue 返回的 promise 被拒绝。 传递给 reject 函数的错误具有名称属性,可帮助你了解调用未能读取或写入数据的原因。
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
dataService.getValue("someKey").then(function(value) {
// Process the value
}, function(error) {
if (error.name === "AccessCheckException") {
alert(error.message);
}
});
});
REST API 访问权限
Azure DevOps Services 为非成员用户提供有限的一组 REST API。 这些 API 包括大多数组织级 API 和项目级 API,这些 API 适用于非成员用户通常可以访问的功能。 决定是否向非成员用户提供扩展时,请考虑此信息。
建议使用版本 5.0 及更高版本的 API,因为 Azure DevOps 使某些 API 仅适用于从版本 5.0 开始的非成员用户。
标识引用
大多数 Azure DevOps Services REST API 使用常见的“协定”来表示用户或组。 为了保护成员信息(如电子邮件地址),Azure DevOps 会省略某些字段,例如 uniqueName,当匿名或公共用户调用 REST API 时。
检查用户权限
使用权限来决定是否在扩展中展示或启用某项功能。 使用 Web 扩展代码中的安全 REST API 检查当前用户在 Azure DevOps Services 中是否具有完成任务的权限。 此方法可防止用户误以为他们有权执行某些操作,却发现他们并没有权限。
检查用户是否有权排队构建
此示例展示了如何使用 Security REST 客户端来检查用户是否有权限在当前项目中排队构建。 默认情况下,非成员用户没有此权限。
VSS.require(["VSS/Service", "VSS/security/RestClient"], function(VSS_Service, Security_RestClient) {
var client = VSS_Service.getCollectionClient(Security_RestClient.SecurityHttpClient3);
var securityToken = VSS.getWebContext().project.id;
client.hasPermissionsBatch({
evaluations: [
{
"securityNamespaceId": "33344D9C-FC72-4d6f-ABA5-FA317101A7E9",
"token": securityToken,
"permissions": 128 /* queue builds */
}
],
alwaysAllowAdministrators: true
}
).then(function(response) {
console.log("Can user queue builds in this project? " + response.evaluations[0].value);
});
});
考虑控制面板小组件需求
与其他类型的贡献一样, restrictedTo 贡献属性控制仪表板小组件贡献的可见性。 例如,若要使小组件对非成员用户和成员用户可见:
{
"contributions": [
{
"id": "HelloWorldWidget",
"type": "ms.vss-dashboards-web.widget",
"targets": [
"ms.vss-dashboards-web.widget-catalog"
],
"restrictedTo": [
"member",
"public",
"anonymous"
],
"properties": {
...
}
}
]
}
配置小组件设置
当你控制非成员用户的小组件可见性时,仪表板框架还为小组件设置提供可选的开放格式存储机制。 两种机制指示插件设置是否对公共项目的非成员用户可用。
具有非成员用户可见的可配置设置的小组件 必须 遵循以下模式之一。 不遵循这些模式会阻止小组件显示给这些用户。
模式 1:小组件声明其实例仅用于存储项目特定设置
将小组件贡献 canStoreCrossProjectSettings 的属性设置为 false,指示小组件设置特定于项目。
{
"id:": "HelloWorldWidget",
"type": "ms.vss-dashboards-web.widget",
...
"properties": {
"canStoreCrossProjectSettings": false
}
}
模式 2:组件实例声明其设置是项目特定的
单个小组件实例还可以指示其设置特定于项目,可供非成员用户使用。 保存设置时,小组件应将hasCrossProjectSettings设置为false在字符串化的 JSON 字符串中:
{
"hasCrossProjectSettings": false,
"hypotheticalWidgetOption": true,
"backlogLevel": "Stories"
}
考虑构建和发布要求
如果扩展提供生成或发布任务,则无需更改才能从公共项目中的管道使用该任务。
处理工作项跟踪事项
扩展在公共项目的上下文中不对非成员用户生效,除非进行更改。 这包括工作项窗体、其他工作项体验以及与工作项跟踪 REST API 的交互。
工作项窗体限制
对于所有非成员用户,Azure DevOps 无法更新或删除任何工作项。
标识处理
在 Azure DevOps Services REST API 版本 5.0 及更高版本中,该服务将标识作为 IdentityRef 对象而不是字符串返回。 如前所述,如果非成员用户进行 API 调用,则 Azure DevOps 不会返回某些字段,例如 uniqueName在这些对象中。
API 范围限制
当当前用户不是组织成员时,扩展只能调用项目范围的 REST API。 Azure DevOps 拒绝未限定为项目的任何 REST API 调用。
查询限制
非成员用户面临与工作项查询相关的以下限制:
- 非成员用户仅能按 ID 或路径运行已知查询
- 查询的范围必须限定为当前项目。 Azure DevOps 排除不属于当前项目的任何工作项
- 非成员用户无法创建新查询或执行 WIQL 查询