快速入门:调用受Microsoft标识平台保护的 Web API

在本快速入门中,你将使用示例 Web 应用来演示如何使用Microsoft标识平台保护 ASP.NET Web API。 此示例使用 Microsoft身份验证库(MSAL) 来处理身份验证和授权。

先决条件

  • 拥有有效订阅的 Azure 帐户。 创建账户
  • Microsoft Entra 管理中心 注册新应用,并从“应用 概述 ”页记录其标识符。 要了解更多信息,请参见注册应用程序
    • 名称NewWebAPI1
    • 支持的帐户类型仅限于此组织目录中的帐户(单一租户)

公开 API

注册 API 后,可以通过定义 API 向客户端应用程序公开的范围来配置其权限。 客户端应用程序通过将访问令牌及其请求传递到受保护的 Web API 来请求执行操作的权限。 然后,仅当 Web API 接收的访问令牌包含所需范围时,Web API 才会执行请求的操作。

添加委托的权限(范围)

API 需要发布至少一个范围(也称为 委派权限),客户端应用才能成功获取用户的访问令牌。 若要发布范围,请执行以下步骤:

  1. 从“应用注册”页中,选择创建的 API 应用程序 (ciam-ToDoList-api) 以打开其“概述”页。

  2. 在“管理”下,选择“公开 API” 。

  3. 在页面顶部的“应用程序 ID URI”旁边,选择“添加”链接以生成对此应用来说独一无二的 URI。

  4. 接受建议的应用程序 ID URI,例如 api://{clientId},然后选择“保存”。 当您的 Web 应用在请求 Web API 的访问令牌时,会将该 URI 添加为 API 每个定义范围的前缀。

  5. 在“此 API 定义的范围”下选择“添加范围”。

  6. 输入以下值,用于定义对 API 的读取访问权限,然后选择添加范围以保存更改:

    资产 价值
    范围名称 ToDoList.Read
    谁可以许可 仅管理员
    管理员同意显示名称 使用“ToDoListApi”读取用户待办事项列表
    管理员同意说明 允许应用使用“TodoListApi”读取用户的待办事项列表
    国家 已启用
  7. 再次选择添加范围,然后输入定义对 API 的读取和写入访问权限范围的以下值。 选择 “添加范围 ”以保存更改:

    资产 价值
    范围名称 ToDoList.ReadWrite
    谁可以许可 仅管理员
    管理员同意显示名称 使用“ToDoListApi”读取和写入用户 ToDo 列表
    管理员同意说明 允许应用使用“ToDoListApi”读取和写入用户的 ToDo 列表
    国家 已启用

详细了解 Web API 的发布权限时的最小特权原则

添加应用程序权限(应用角色)

API 需要为应用程序发布至少一个应用角色(也称为 应用程序权限),客户端应用才能自行获取访问令牌。 应用程序权限是 API 想要使客户端应用程序能够成功地以自己的身份进行身份验证(无需让用户登录)时应发布的权限类型。 若要发布应用程序权限,请执行下列步骤:

  1. 从“应用注册”页中,选择创建的应用程序(例如 ciam-ToDoList-api)以打开其“概述”页。

  2. 在“管理”下,选择“应用角色”。

  3. 选择“创建应用角色”,输入以下值,然后选择“应用”以保存更改:

    资产 价值
    显示名称 ToDoList.Read.All
    允许的成员类型 应用程序
    价值 ToDoList.Read.All
    DESCRIPTION 允许应用使用“TodoListApi”读写每个用户的待办事项列表
    要启用此应用角色吗? 保持选中状态
  4. 再次选择“创建应用角色”,为第二个应用角色输入以下值,然后选择“应用”以保存更改:

    资产 价值
    显示名称 ToDoList.ReadWrite.All
    允许的成员类型 应用程序
    价值 ToDoList.ReadWrite.All
    DESCRIPTION 允许应用使用“ToDoListApi”读写每个用户的 ToDo 列表
    要启用此应用角色吗? 保持选中状态

屏幕截图显示了向 API 添加范围时的字段值。

克隆或下载示例应用程序

若要获取示例应用程序,可以从 GitHub 克隆它或将其下载为 .zip 文件。

git clone https://github.com/Azure-Samples/ms-identity-ciam-dotnet-tutorial.git
  • 下载 .zip 文件。 将其解压缩到名称长度少于 260 个字符的文件路径。

配置示例应用程序

配置代码示例以匹配已注册的 Web API。

  1. 在 IDE 中,打开包含示例的项目文件夹 ms-identity-ciam-dotnet-tutorial/2-Authorization/3-call-own-api-dotnet-core-daemon/ToDoListAPI

  2. 打开 appsettings.json 文件,其中包含以下代码片段:

    {
      "AzureAd": {
        "Instance": "Enter_the_Authority_URL_Here", 
        "TenantId": "Enter_the_Tenant_Id_Here",
        "ClientId": "Enter_the_Application_Id_Here",
        "Scopes": {
          "Read": ["ToDoList.Read", "ToDoList.ReadWrite"],
          "Write": ["ToDoList.ReadWrite"]
        },
        "AppPermissions": {
          "Read": ["ToDoList.Read.All", "ToDoList.ReadWrite.All"],
          "Write": ["ToDoList.ReadWrite.All"]
        }
      },
      "Logging": {...},
      "AllowedHosts": "*"
    }
    

    查找以下值:

    • ClientId - 应用程序的标识符,也称为客户端。 将引号中的 value 文本替换为先前从注册应用程序的“概述”页中记录的应用程序(客户端)ID。
    • TenantId - 应用程序注册所在租户的标识符。 将引号中的 value 文本替换为注册应用程序“概述页”中先前记录的 目录(租户)ID 值。
    • Instance - 它指定Microsoft身份验证库(MSAL)可从中请求令牌的目录。 根据您的情况,将 Enter_the_Authority_URL_Here 替换为以下任一值:
      • 对于员工租户,请使用 https://login.partner.microsoftonline.cn/ 作为实例。

运行示例应用程序

  1. 从 Web API 项目目录的根目录运行以下命令以启动应用:

    dotnet run
    
  2. 如果一切正常,终端将显示如下所示的输出:

     Building...
         info: Microsoft.Hosting.Lifetime[14]
               Now listening on: https://localhost:{port}
         info: Microsoft.Hosting.Lifetime[0]
               Application started. Press Ctrl+C to shut down.
         info: Microsoft.Hosting.Lifetime[0]
               Hosting environment: Development
    ...
    

    记录 https://localhost:{port} URL 中的端口号。

  3. 若要验证终结点是否受保护,请更新下面的 cURL 命令中的基 URL 以匹配在上一步中收到的终结点,然后运行该命令:

    curl -k -X GET https://localhost:<your-api-port>/api/todolist -w "%{http_code}\n"
    

    预期响应为 401 未授权。

后续步骤

了解如何使用Microsoft标识平台保护 ASP.NET Core Web API。