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

如何基于Azure应用注册实现.NET 6应用的多资源授权?

.NET 6 OAuth2授权码流+Azure AD+Azure DevOps API的安全实现方案

问题背景

在.NET 6 Web应用中使用Azure AD OAuth2授权码流完成认证后,尝试在同一授权请求中同时包含自定义API的scope(api://tenantid/custom_scope_name)和Azure DevOps的固定scope(499b84ac-1321-427f-aa17-267ca6975798/user_impersonation),触发AADSTS28003错误。已知Azure AD不支持单请求多资源scope,需要安全且符合规范的实现方式。

对两种临时方案的评估

  • 方案1(禁用受众验证):完全不推荐。受众验证是令牌安全的核心校验机制,禁用后会允许任何有效Azure AD令牌访问你的应用,存在严重的权限滥用风险。
  • 方案2(用刷新令牌获取DevOps令牌):思路可行,但需要基于官方标准流程实现,避免自行处理令牌带来的安全隐患。

正确实现方案(基于Microsoft Identity Platform标准流程)

1. 初始授权仅请求自定义API Scope

在Swagger配置和应用认证逻辑中,初始授权流程只请求你的自定义应用scope,同时确保在Azure应用注册中启用offline_access scope(用于获取刷新令牌),完成用户认证并拿到合法的应用访问令牌与刷新令牌。

2. 利用官方库获取Azure DevOps的访问令牌

使用Microsoft.Identity.Web库封装的令牌获取逻辑,基于已有的用户刷新令牌,安全地获取Azure DevOps API的访问令牌,无需自行处理令牌交换细节。

步骤1:安装依赖

安装NuGet包:

Install-Package Microsoft.Identity.Web

步骤2:配置认证和下游API服务

在Program.cs中添加配置:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches(); // 生产环境推荐使用分布式缓存(如Redis)提升安全性

// 配置Azure DevOps为下游服务
builder.Services.AddDownstreamApi("AzureDevOpsApi", builder.Configuration.GetSection("AzureDevOpsApi"));

在appsettings.json中添加API配置:

"AzureDevOpsApi": {
  "BaseUrl": "https://dev.azure.com/YourOrganization/",
  "Scopes": "499b84ac-1321-427f-aa17-267ca6975798/user_impersonation"
}

步骤3:在业务逻辑中调用Azure DevOps API

在Controller中注入服务并获取令牌调用API:

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

public class DevOpsController : ControllerBase
{
    private readonly IDownstreamApi _downstreamApi;
    private readonly IHttpContextAccessor _httpContextAccessor;

    public DevOpsController(IDownstreamApi downstreamApi, IHttpContextAccessor httpContextAccessor)
    {
        _downstreamApi = downstreamApi;
        _httpContextAccessor = httpContextAccessor;
    }

    public async Task<IActionResult> GetProjects()
    {
        // 获取Azure DevOps的访问令牌
        var tokenAcquisition = _httpContextAccessor.HttpContext.RequestServices.GetRequiredService<ITokenAcquisition>();
        string devOpsToken = await tokenAcquisition.GetAccessTokenForUserAsync(
            new[] { "499b84ac-1321-427f-aa17-267ca6975798/user_impersonation" });

        // 调用Azure DevOps API
        var response = await _downstreamApi.CallApiAsync<object>("AzureDevOpsApi", options =>
        {
            options.RelativePath = "_apis/projects?api-version=7.1-preview.4";
            options.Headers.Authorization = new AuthenticationHeaderValue("Bearer", devOpsToken);
        });

        return Ok(response);
    }
}

3. 核心安全保障

  • 保留受众验证:严格保留应用的受众校验逻辑,确保只有针对你的自定义API的令牌能访问应用接口。
  • 安全管理令牌:Microsoft.Identity.Web自动处理刷新令牌的存储和轮换,避免手动存储带来的泄露风险,生产环境使用分布式缓存进一步提升安全性。
  • 最小权限原则:在Azure应用注册中仅添加业务必需的Azure DevOps API权限,避免过度授权。
  • 强制HTTPS:所有授权请求和API调用必须通过HTTPS传输,防止令牌被截获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:53:13