使用Azure AD保护并调用ASP.NET Core最小化Web API
文章目录
尽管有许多教程可以指导完成使用 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
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- 什么是 OpenReview
- Vue中使用echarts@4.x中国地图及AMap相关API的使用
- 使用 Zeplin API 实现 Zeplin 移动化
- Rest API 教程 – 完整的初学者指南
- API Key 密钥 vs OAuth 2.0:身份认证的比较
- Claude API 能使用 OpenAI 接口协议吗?
- 使用DeepSeek R1、LangChain和Ollama构建端到端生成式人工智能应用
- 如何获取通义千问 API Key 密钥(分步指南)
- 您需要了解的OpenAI Assistants API功能 – PageOn.ai
- DRF库详解:用Django轻松搭建功能强大的API服务
- 一文搞懂在 HTTP 如何 one-api 调用,实操指南来袭!
- 探索海洋数据的宝库:Amentum海洋数据探测API的潜力