快速入門:使用 Microsoft 身分識別平台 保護 ASP.NET Core Web API

本快速入門會使用 ASP.NET Core Web API 程式代碼範例來示範如何限制授權帳戶的資源存取。 此範例會使用與 Microsoft 驗證連結庫 (MSAL) 互動的 ASP.NET Core Identity 來處理驗證。

必要條件

註冊應用程式和記錄標識碼

提示

本文中的步驟可能會根據您從開始的入口網站稍有不同。

若要完成註冊,請提供應用程式名稱,並指定支援的帳戶類型。 註冊之後,應用程式 [概觀] 頁面會顯示應用程式原始程式碼中所需的標識碼。

  1. 以至少應用程式開發人員身分登入 Microsoft Entra 系統管理中心

  2. 如果您有多個租使用者的存取權,請使用頂端功能表中的 [設定] 圖示,切換至您想要從 [目錄 + 訂用帳戶] 功能表註冊應用程式的租使用者。

  3. 流覽至 [身分>識別應用程式> 應用程式註冊]。

  4. 選取新增註冊

  5. 輸入應用程式的 [名稱],例如 NewWebAPI1

  6. 針對 [支持的帳戶類型],選取 [僅限此組織目錄中的帳戶]。 如需不同帳戶類型的資訊,請選取 [ 協助我選擇] 選項。

  7. 選取註冊

    顯示如何輸入名稱並選取帳戶類型的螢幕快照。

  8. 註冊完成時,會顯示應用程式的 [ 概觀 ] 窗格。 記錄要用於應用程式原始碼的目錄(租使用者)標識碼應用程式(用戶端)標識碼

    顯示概觀頁面上標識碼值的螢幕快照。

注意

藉由參考修改應用程式支援的帳戶,即可變更支援的帳戶類型

公開 API

註冊 API 之後,您可以定義 API 公開給用戶端應用程式的範圍來設定其許可權。 用戶端應用程式會藉由將存取令牌及其要求傳遞至受保護的 Web API,來要求執行作業的許可權。 只有當收到的存取令牌包含所需的範圍時,Web API 才會執行要求的作業。

  1. 在 [管理] 底下,選取 [公開 API > 新增範圍]。 選取 [儲存並繼續],以接受建議的應用程式標識碼 URI(api://{clientId}) {clientId}是從 [概觀] 頁面記錄的值。 然後輸入下列資訊:

    1. 針對 [範圍名稱],輸入 Forecast.Read
    2. 為 神秘 可以同意,請確定已選取 [管理員 和使用者] 選項。
    3. 在 [管理員 同意顯示名稱] 方塊中, 輸入 Read forecast data
    4. 在 [管理員 同意描述] 方塊中, 輸入 Allows the application to read weather forecast data
    5. 在[ 使用者同意顯示名稱 ] 方塊中, 輸入 Read forecast data
    6. 在[ 使用者同意描述] 方塊 中, 輸入 Allows the application to read weather forecast data
    7. 確定 [ 狀態 ] 設定為 [已啟用]。
  2. 選取新增範圍。 如果已正確輸入範圍,則會列在 [ 公開 API ] 窗格中。

    顯示將範圍新增至 API 時域值的螢幕快照。

複製或下載範例應用程式

若要取得範例應用程式,您可以從 GitHub 複製它,或將它下載為 .zip 檔案。

  • 若要複製範例,請開啟命令提示字元並流覽至您想要建立專案的位置,然後輸入下列命令:

    git clone https://github.com/Azure-Samples/ms-identity-docs-code-dotnet.git
    
  • 下載.zip檔案。 將它解壓縮到名稱長度少於 260 個字元的檔案路徑。

設定 ASP.NET Core 範例應用程式

  1. 在您的 IDE 中,開啟包含範例的項目資料夾 ms-identity-docs-code-dotnet/web-api

  2. 開啟 appsettings.json 檔案,其中包含下列代碼段:

    {
      "AzureAd": {
        "Instance": "https://login.microsoftonline.com/",
        "TenantId": "Enter the tenant ID obtained from the Microsoft Entra admin center",
        "ClientId": "Enter the client ID obtained from the Microsoft Entra admin center",
        "Scopes": "Forecast.Read"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    

    尋找下列專案 key

    • ClientId - 應用程式的識別碼,也稱為用戶端。 將value引號中的文字取代為先前從已註冊應用程式 [概觀] 頁面記錄的應用程式 (client) 識別碼
    • TenantId - 註冊應用程式之租用戶的識別碼。 將value引號中的文字取代為先前從已註冊應用程式 [概觀] 頁面記錄的目錄 (tenant) 識別符值。

執行範例應用程式

  1. 執行下列命令以啟動應用程式:

    dotnet run
    
  2. 如下列範例所示的輸出隨即出現:

    ...
    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: https://localhost:{port}
    ...
    

    在 URL 中 https://localhost:{port} 記錄埠號碼。

  3. 若要確認端點受到保護,請使用Bash中的下列 cURL 命令,在Bash中傳送未經驗證的 HTTP GET 要求:

    curl -X GET https://localhost:5001/weatherforecast -ki
    

    預期的回應為 401 未經授權,其輸出類似:

    user@host:~$ curl -X GET https://localhost:5001/weatherforecast -ki
    HTTP/2 401
    date: Fri, 23 Sep 2023 23:34:24 GMT
    server: Kestrel
    www-authenticate: Bearer
    content-length: 0