You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Azure AD的.NET Core Web API与守护程序认证最佳方案咨询

最优Azure AD认证方案:守护程序调用带角色的.NET Core Web API

我刚好处理过类似的场景,给你梳理一套实操的最佳方案,完全适配你的需求:

一、核心方案选型

对于无用户交互的守护程序调用Web API的场景,**客户端凭据流(Client Credentials Flow)**是Azure AD官方推荐的最优方案。这个流基于应用身份(而非用户身份)进行认证,完美匹配守护程序的服务端运行特性。

二、Azure AD后台配置步骤

1. 确保Web API应用的角色配置正确

  • 登录Azure Portal,找到你的Web API对应的Azure AD应用,进入「应用角色」页面
  • 添加所需的应用角色(比如Api.ReadAccess、Api.WriteAccess),注意必须将「允许分配到」设置为「应用程序」(因为守护程序是应用身份,不是用户)
  • 保存角色配置

2. 给守护程序应用分配Web API角色

  • 找到守护程序对应的Azure AD应用,进入「API权限」页面
  • 点击「添加权限」→ 选择「我的API」,找到你的Web API应用
  • 切换到「应用权限」标签,勾选你需要分配的角色,点击「添加权限」
  • 最后点击「授予管理员同意」(客户端凭据流必须完成这一步,否则无法获取有权限的令牌)

3. 记录关键配置信息

你需要记下这些信息用于后续代码配置:

  • Web API应用的应用ID URI(在「概述」页面,格式类似api://xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx)
  • 守护程序应用的客户端ID和客户端密钥/证书(证书更安全,优先推荐)
  • Azure AD的租户ID

三、.NET Core Web API代码配置

1. 安装依赖包

在Web API项目中安装官方认证包:

Install-Package Microsoft.Identity.Web

2. 配置appsettings.json

添加Azure AD相关配置:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "TenantId": "你的租户ID",
  "ClientId": "Web API的应用ID",
  "Audience": "Web API的应用ID URI" // 必须和守护程序请求的受众一致
}

3. 配置认证与授权中间件

在Program.cs中添加认证和授权逻辑:

var builder = WebApplication.CreateBuilder(args);

// 添加Azure AD认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

// 配置基于角色的授权策略
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("RequireApiReadAccess", policy =>
        policy.RequireRole("Api.ReadAccess"));
});

// 添加控制器
builder.Services.AddControllers();

var app = builder.Build();

// 启用认证和授权(顺序不能错)
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

4. 保护API接口

在需要保护的控制器或方法上添加授权属性:

[Authorize(Policy = "RequireApiReadAccess")]
[ApiController]
[Route("api/[controller]")]
public class DataController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("Authenticated and authorized access granted");
    }
}

四、守护程序客户端代码配置

1. 安装依赖包

在守护程序项目中安装MSAL(Microsoft身份验证库):

Install-Package Microsoft.Identity.Client

2. 编写认证与API调用代码

using Microsoft.Identity.Client;
using System.Net.Http.Headers;

var tenantId = "你的租户ID";
var clientId = "守护程序应用ID";
var clientSecret = "守护程序应用密钥"; // 或者使用证书,代码会略有不同
var apiAudience = "Web API的应用ID URI";
var apiUrl = "https://你的Web API地址/api/data";

// 初始化MSAL应用
var confidentialClient = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

// 获取访问令牌(客户端凭据流)
var authResult = await confidentialClient.AcquireTokenForClient(new[] { $"{apiAudience}/.default" })
    .ExecuteAsync();

// 调用Web API
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
var response = await httpClient.GetAsync(apiUrl);

// 处理响应
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseContent);

五、关键注意事项

  • 安全优先:尽量用证书代替客户端密钥,在Azure Portal的守护程序应用「证书和密码」页面上传证书即可,代码中只需替换为WithCertificate方法。
  • 权限最小化:只给守护程序分配它实际需要的角色,避免过度授权。
  • 调试技巧:可以用https://jwt.ms解析获取到的令牌,检查roles声明是否包含分配的角色,aud是否和Web API的应用ID URI一致。
  • 令牌自动验证:Microsoft.Identity.Web会自动验证令牌的签名、受众、过期时间等,无需手动编写验证逻辑,确保配置正确即可。

内容的提问来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:37:06