使用Azure AD保护并调用ASP.NET Core最小化Web API

作者:API传播员 · 2025-11-01 · 阅读时间:5分钟

尽管有许多教程可以指导完成使用 Azure AD 保护并调用 ASP.NET Core 最小化 Web API 的任务,但在实际操作中可能会遇到一些陷阱。本文将记录实现这一目标的具体步骤,帮助开发者避免常见问题,并提供一个完整的实现指南。


使用 Azure AD 保护并调用 ASP.NET Core 最小化 Web API

本文的方法基于官方教程,但有所调整,使用了最少的 API,并增加了一个额外步骤,展示如何通过 Azure CLI 获取访问令牌。我们将使用两个项目:一个 .NET 7 最小化 Web API 和一个 .NET 7 控制台应用程序(即“机密客户端”),后者将调用前者。


在 Azure AD 中为 Web API 创建应用程序注册

1. 创建应用程序注册

在 Azure 门户中,搜索“应用程序注册”,并创建一个新的应用程序注册。第一个注册是为 Web API 创建的,建议命名为“My Web API”。

  • 支持的帐户类型:选择默认值“仅此组织目录中的帐户”。
  • 单击“注册”。

2. 修改应用程序注册

完成注册后,需要进行以下两项主要更改:

编辑清单

在左侧菜单中选择“清单”,找到 appRoles 定义部分,并添加以下 JSON 片段:

"appRoles": [
  {
    "allowedMemberTypes": ["Application"],
    "description": "此角色中的 Daemon 应用程序可以使用 Web API。",
    "displayName": "DaemonAppRole",
    "id": "4fb105fa-aaf2-4a13-9fc4-24dbbd50ffd5",
    "isEnabled": true,
    "lang": null,
    "origin": "Application",
    "value": "DaemonAppRole"
  }
]

公开 API

在左侧菜单中选择“公开 API”,单击“应用程序 ID URI”旁边的“设置”,生成一个类似于以下格式的 URI:

api://50bad0fb-43f8-4599-a38e-faf49e40c7d0

记录下“应用程序(客户端)ID”和“目录(租户)ID”,后续步骤中会用到。


为客户端应用程序创建应用程序注册

1. 创建客户端应用程序注册

再次在 Azure 门户中创建一个新的应用程序注册,命名为“My Web API 客户端”,并保持默认设置。

2. 修改客户端应用程序注册

完成注册后,需要进行以下三项更改:

添加客户端密钥

在“证书和机密”部分,添加一个新的客户端密钥,并选择适当的到期时间。生成后,立即复制密钥值并妥善保存,因为之后无法再次查看。

添加 API 权限

在“API 权限”部分,单击“添加权限”,选择“我的 API”,然后选择之前创建的 Web API 应用程序注册。在权限配置中,选择“应用程序”类型的 DaemonAppRole,并添加权限。

授予管理员同意

在“已配置权限”表顶部,单击“授予管理员同意”链接。执行后,DaemonAppRole 权限旁边应显示绿色复选标记。


配置 Web API

1. 配置身份验证和授权

在 Web API 项目中,使用 .NET 7 的“最小化 API”模板。在 Program.cs 文件中,添加以下代码:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddAuthorization();

需要引入以下命名空间:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

2. 更新配置文件

appsettings.json 文件中,添加以下配置,并替换为实际值:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "mydomain.onmicrosoft.com",
  "TenantId": "750c540a-687c-4160-9433b49c9997",
  "ClientId": "50bad0fb-43f8-4599-a38e-faf49e40c7d0"
}

3. 保护 API 端点

在需要保护的端点上添加授权。例如:

app.MapGet("/", () => "Hello World!").RequireAuthorization();

或者对整个端点组进行授权:

var weather = app.MapGroup("/weather").RequireAuthorization();

从机密客户端调用 Web API

1. 准备必要的配置

需要以下信息:

  • 范围:由 Web API 的“应用程序 ID URI”和 /.default 组成,例如 api://50bad0fb-43f8-4599-a38e-faf49e40c7d0/.default
  • 租户 ID客户端 ID:分别来自 Web API 和客户端应用程序注册。
  • 客户端密钥:从客户端应用程序注册中生成。
  • Web API 的 URL:例如 https://localhost:7283/myAPI

2. 获取访问令牌

使用以下代码通过 ConfidentialClientApplicationBuilder 获取访问令牌:

var app = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithTenantId(tenantId)
    .WithClientSecret(clientSecret)
    .Build();

var result = await app.AcquireTokenForClient(scopes).ExecuteAsync();

3. 调用 Web API

使用获取的令牌调用 Web API:

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

string json = await client.GetStringAsync(url);
Console.WriteLine(json);

使用 Azure CLI 获取访问令牌

1. 配置 Azure CLI 的权限

在 Web API 的应用程序注册中,添加一个新范围(例如 user_access),并在“授权客户端应用程序”中添加 Azure CLI 的客户端 ID 04b07795-8db-461a-bbee-02f9e1bf7b46

2. 获取访问令牌

在 PowerShell 中运行以下命令:

$TENANT = "750c540a-687c-4160-9d86-9433b49c9997"
$TOKEN = az account get-access-token --tenant $TENANT --scope "api://50bad0fb-43f8-4599-a38e-faf49e40c7d0/.default" --query "accessToken" -o tsv

3. 调用 Web API

使用以下命令调用 Web API:

$HEADERS = @{ Authorization = "Bearer $TOKEN" }
$RESP = Invoke-RestMethod -Method Get -Uri "https://localhost:7283/myAPI/" -Headers $HEADERS

总结

本文详细介绍了如何使用 Azure AD 保护 ASP.NET Core 最小化 Web API,并通过机密客户端调用它的完整流程。尽管设置过程可能稍显复杂,但通过本文的指导,可以有效避免常见问题。如果您有更好的实现方法,欢迎在评论中分享。

原文链接: https://markheath.net/post/secure-aspnet-core-web-api-azure-ad