快速入门:使用 Microsoft 标识平台保护 ASP.NET Core Web API

本快速入门使用 ASP.NET Core Web API 代码示例来演示如何限制对授权帐户的资源访问。 此示例使用与 Microsoft 身份验证库 (MSAL) 交互的 ASP.NET Core 标识来处理身份验证。

先决条件

注册应用程序和记录标识符

提示

本文中的步骤可能因开始使用的门户而略有不同。

若要完成注册,请为应用程序命名并指定支持的帐户类型。 注册后,应用程序“概述”页面将显示应用程序源代码中所需的标识符

  1. 至少以应用程序开发人员的身份登录到 Microsoft Entra 管理中心

  2. 如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你希望在其中注册应用程序的租户。

  3. 浏览到“标识”>“应用程序”>“应用注册”。

  4. 选择“新注册”。

  5. 为应用程序输入名称,例如 NewWebAPI1

  6. 对于“支持的帐户类型”设置,请选择“仅限此组织目录中的帐户”。 要了解不同帐户类型的信息,选择“帮我选择”选项。

  7. 选择“注册”。

    显示如何输入名称并选择帐户类型的屏幕截图。

  8. 注册完成后,将显示应用程序的“概述”窗格。 记录要用于应用程序源代码的目录(租户)ID应用程序(客户端)ID

    显示概述页面上标识符值的屏幕截图。

注意

可以通过参照修改应用程序支持的帐户来更改支持的帐户类型

公开 API

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

  1. 在“管理”下,选择“公开 API > 添加范围”。 选择“保存并继续”,以接受建议的应用程序 ID 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 文本替换为先前从注册应用程序的“概述”页中记录的应用程序(客户端)ID。
    • TenantId - 注册应用程序的租户标识符。 将引号中的 value 文本替换为注册应用程序的“概述”页中先前记录的目录(租户)ID 值。

运行示例应用程序

  1. 执行以下命令以启动应用:

    dotnet run
    
  2. 将显示如下示例所示的输出:

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

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

  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