共用方式為


開發公共專案的延伸模組

Azure DevOps 服務

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 會遭到拒絕。 傳遞給拒絕函數的錯誤具有 name 屬性,可協助您了解呼叫讀取或寫入資料失敗的原因。

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,適用於非成員使用者通常可以存取的功能。 當您決定是否將擴充功能提供給非成員使用者時,請考慮此資訊。

建議您使用 5.0 版和更新版本的 API,因為 Azure DevOps 只會讓非成員使用者使用某些 API,從 5.0 版開始。

身分參照

大部分的 Azure DevOps Services REST API 都會使用常見的「合約」來代表使用者或群組。 為了保護成員資訊,例如電子郵件地址,Azure DevOps 會省略某些欄位,例如 uniqueName,當匿名或公用使用者叫用 REST API 時。

檢查使用者權限

使用許可權來決定是否要在延伸模組中顯示或啟用功能。 使用 Web 延伸模組程式碼中的安全性 REST API,檢查目前的使用者是否具有 Azure DevOps Services 中的許可權來完成工作。 這種方法可以防止用戶認為他們有權執行某事,卻發現他們沒有。

檢查使用者是否有權將建置排入佇列

此範例示範如何使用安全性 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": {
          ...
      }
    }
  ]
}

設定小工具設定

當您控制非成員使用者的小組件可見度時,儀表板架構也會為小組件設定提供選擇性的開放式表單儲存機制。 兩種機制指出小組件設定是否可供公用專案中的非成員使用者使用。

非成員使用者可見且具有可配置設定的 widget 必須 遵循下列其中一種模式。 不遵循這些模式會阻止小工具向這些使用者顯示。

模式 1:Widget 宣告其實例僅儲存專案特定設定

將小組件貢獻的內容 canStoreCrossProjectSettings 設為 false,表示小組件設定是專案特定的。

{
    "id:": "HelloWorldWidget",
    "type": "ms.vss-dashboards-web.widget",
    ...
    "properties": {
        "canStoreCrossProjectSettings": false
    }
}

模式 2:Widget 實例宣告其設定是與專案相關的

個別小組件實例也可以指出其設定是專案特定的,且可供非成員使用者使用。 儲存設定時,小工具應在 JSON 字串化後的字串中將 hasCrossProjectSettings 設定為 false

{
    "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 呼叫。

查詢限制

非成員使用者面臨下列與工作專案查詢相關的限制:

  • 非成員使用者只能依識別碼或路徑執行已知查詢
  • 查詢的範圍必須限定為目前的專案。 Azure DevOps 會排除不屬於目前專案的任何工作項目
  • 非成員使用者無法建立新的查詢或執行 WIQL 查詢