快速入门:使用 Microsoft 标识平台保护 ASP.NET Core Web API
本快速入门使用 ASP.NET Core Web API 代码示例来演示如何限制对授权帐户的资源访问。 此示例使用与 Microsoft 身份验证库 (MSAL) 交互的 ASP.NET Core 标识来处理身份验证。
先决条件
- 具有有效订阅的 Azure 帐户。 如果没有帐户,可免费创建一个帐户。
- 最低要求 .NET 8.0 SDK
- Visual Studio 2022 或 Visual Studio Code
注册应用程序和记录标识符
提示
本文中的步骤可能因开始使用的门户而略有不同。
若要完成注册,请为应用程序命名并指定支持的帐户类型。 注册后,应用程序“概述”页面将显示应用程序源代码中所需的标识符。
至少以应用程序开发人员的身份登录到 Microsoft Entra 管理中心。
如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你希望在其中注册应用程序的租户。
浏览到“标识”>“应用程序”>“应用注册”。
选择“新注册”。
为应用程序输入名称,例如 NewWebAPI1。
对于“支持的帐户类型”设置,请选择“仅限此组织目录中的帐户”。 要了解不同帐户类型的信息,选择“帮我选择”选项。
选择“注册”。
注册完成后,将显示应用程序的“概述”窗格。 记录要在应用程序源代码中使用的目录(租户)ID 和应用程序(客户端)ID。
注意
可以通过参照修改应用程序支持的帐户来更改支持的帐户类型。
公开 API
注册 API 后,可以通过定义 API 向客户端应用程序公开的范围来配置其权限。 客户端应用程序通过将访问令牌及其请求传递到受保护的 Web API 来请求执行操作的权限。 然后,仅当 Web API 接收的访问令牌包含所需范围时,Web API 才会执行请求的操作。
在“管理”下,选择“公开 API > 添加范围”。 通过选择“保存并继续”来接受建议的应用程序 ID URI
(api://{clientId})
。{clientId}
是从“概述”页面记录的值。 然后输入以下信息:- 对于“范围名称”,输入
Forecast.Read
。 - 对于“谁能同意?”,请确保选择了“管理员和用户”选项。
- 在“管理员同意显示名称”框中,输入
Read forecast data
。 - 在“管理员同意说明”框中,输入
Allows the application to read weather forecast data
。 - 在“用户同意显示名称”框中,输入
Read forecast data
。 - 在“用户同意说明”框中,输入
Allows the application to read weather forecast data
。 - 确保将“状态”设置为“已启用”。
- 对于“范围名称”,输入
选择“添加作用域”。 如果已正确输入范围,则会在“公开 API”窗格中列出该范围。
克隆或下载示例应用程序
若要获取示例应用程序,可以从 GitHub 克隆它或将其下载为 .zip 文件。
若要克隆示例,请打开命令提示符并导航到要创建项目的位置,然后输入以下命令:
git clone https://github.com/Azure-Samples/ms-identity-docs-code-dotnet.git
下载 .zip 文件。 将其提取到名称长度小于 260 个字符的文件路径。
配置 ASP.NET Core 示例应用程序
在 IDE 中,打开包含示例的项目文件夹 ms-identity-docs-code-dotnet/web-api。
打开
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 值。
运行示例应用程序
执行以下命令以启动应用:
dotnet run
将显示如下示例所示的输出:
... info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:{port} ...
记录
http://localhost:{port}
URL 中的端口号。若要验证终结点是否受保护,请更新下面的 cURL 命令中的基 URL 以匹配在上一步中收到的终结点,然后运行该命令:
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
后续步骤
继续阅读下一篇文章,了解如何使用 cURL 调用受保护的 Web API。