测试受保护的 API
本教程是一系列教程的最后一部分,演示如何生成和测试在外部租户中注册的受保护 Web API。 在本系列的第 1 部分中,你创建了一个 ASP.NET Core Web API 并保护其终结点。 在此最后一步中,你将注册守护程序应用并测试 API。
本教程介绍如何执行下列操作:
- 使用调用 Web API 的轻量级守护程序应用测试受保护的 Web API
先决条件
教程:保护外部租户中注册的 ASP.NET 核心 Web API
注册守护程序应用
以下步骤演示如何在 Microsoft Entra 管理中心注册守护程序应用:
至少以应用程序开发人员的身份登录到 Microsoft Entra 管理中心。
如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你的外部租户。
浏览到“标识”>“应用程序”>“应用注册”。
选择“+ 新建注册”。
在出现的“注册应用程序”页面中,输入应用程序的注册信息:
在“名称”部分中,输入将向应用用户显示的有意义的应用程序名称,例如“ciam-client-app”。
在“支持的帐户类型”下,选择“仅此组织目录中的帐户” 。
选择“注册”。
注册完成后,将显示应用程序的“概述”窗格。 记录要在应用程序源代码中使用的目录(租户)ID 和应用程序(客户端)ID。
为注册的应用创建客户端机密。 应用程序在请求令牌时使用客户端密码来证明其身份。
- 从“应用注册”页中,选择创建的应用程序(例如 ciam-client-app)以打开其“概述”页。
- 在“管理”下,选择“证书和机密”。
- 选择“新建客户端机密”。
- 在“说明”框中输入对客户端密码的说明(如 ciam 应用客户端密码)。
- 在“过期时间”下,选择密码的有效期(根据组织的安全规则),然后选择“添加”。
- 记下机密的“值”。 在稍后的步骤中将使用此值进行配置。 离开“证书和机密”后,机密值不会再次显示,并且无法以任何方式检索。 请确保记录它。
为守护程序应用分配应用角色
自行进行身份验证的应用需要应用权限。
从“应用注册”页中,选择创建的应用程序(例如 ciam-client-app)。
在“管理”下选择“API 权限” 。
在“已配置权限”下,选择“添加权限”。
选择“我的组织使用的 API”选项卡。
在 API 列表中,选择 API(例如 ciam-ToDoList-api)。
选择“应用程序权限”选项。 我们选择此选项是因为应用以自身身份登录,而不是以用户身份登录。
从权限列表中,选择“TodoList.Read.All”、“ToDoList.ReadWrite.All”(必要时使用搜索框)。
选择“添加权限”按钮。
此时,你已正确分配了权限。 但是,由于守护程序应用不允许用户与之交互,因此用户本身无法同意这些权限。 若要解决此问题,作为管理员的你必须代表租户中的所有用户同意这些权限:
- 选择“为 <租户名称> 授予管理员同意”,然后选择“是”。
- 选择“刷新”,然后验证两个权限的“状态”下是否均显示“已为 <租户名称> 授予”。
编写代码
初始化 .NET 控制台应用并导航到其根文件夹
dotnet new console -o MyTestApp cd MyTestApp
通过运行以下命令,安装 MSAL 来帮助你处理身份验证:
dotnet add package Microsoft.Identity.Client
运行 API 项目并记下运行它的端口。
打开 Program.cs 文件,将“Hello world”代码替换为以下代码。
using System; using System.Net.Http; using System.Net.Http.Headers; HttpClient client = new HttpClient(); var response = await client.GetAsync("https://localhost:<your-api-port>/api/todolist"); Console.WriteLine("Your response is: " + response.StatusCode);
导航到守护程序应用根目录,使用命令
dotnet run
运行应用。 此代码发送一个没有访问令牌的请求。 你应该会在控制台中看到字符串“你的响应是: 未授权”。删除步骤 4 中的代码,将其替换为以下代码,以通过发送一个具有有效访问令牌的请求来测试你的 API。
using Microsoft.Identity.Client; using System; using System.Net.Http; using System.Net.Http.Headers; HttpClient client = new HttpClient(); var clientId = "<your-daemon-app-client-id>"; var clientSecret = "<your-daemon-app-secret>"; var scopes = new[] {"api://<your-web-api-application-id>/.default"}; var tenantName= "<your-tenant-name>"; var authority = $"https://{tenantName}.ciamlogin.com/"; var app = ConfidentialClientApplicationBuilder .Create(clientId) .WithAuthority(authority) .WithClientSecret(clientSecret) .Build(); var result = await app.AcquireTokenForClient(scopes).ExecuteAsync(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); var response = await client.GetAsync("https://localhost:44351/api/todolist"); Console.WriteLine("Your response is: " + response.StatusCode);
导航到守护程序应用根目录,使用命令
dotnet run
运行应用。 此代码发送一个具有有效访问令牌的请求。 你应该会在控制台中看到字符串“你的响应是: 正常”。