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

使用Azure托管标识实现REST API通信授权的POC开发问询

使用Azure托管标识实现.NET Core应用间的身份验证

应用A:携带托管标识发起HTTP请求

前置准备

先安装必要的NuGet包:

  • Azure.Identity:用于获取托管标识的访问令牌
  • System.Net.Http:.NET Core自带,用于发起HTTP请求

实现步骤

  1. 注入依赖:在Program.cs中注册HttpClient和DefaultAzureCredential(自动适配托管标识环境):
builder.Services.AddHttpClient();
builder.Services.AddSingleton<DefaultAzureCredential>();

如果使用用户分配的托管标识,需要指定标识的Client ID:

builder.Services.AddSingleton(new DefaultAzureCredential(
    new DefaultAzureCredentialOptions 
    { 
        ManagedIdentityClientId = "你的用户分配标识Client ID" 
    }));
  1. 获取令牌并发起请求:在控制器或服务中,获取目标应用(应用B)的访问令牌,添加到请求头:
private readonly HttpClient _httpClient;
private readonly DefaultAzureCredential _credential;
// 应用B的Client ID或应用ID URI(如api://<app-b-client-id>)
private readonly string _appBTargetResource = "应用B的Client ID";

public AppAController(HttpClient httpClient, DefaultAzureCredential credential)
{
    _httpClient = httpClient;
    _credential = credential;
}

public async Task<IActionResult> CallAppBApi()
{
    // 请求应用B的默认范围令牌
    var tokenContext = new TokenRequestContext(new[] { $"{_appBTargetResource}/.default" });
    var tokenResult = await _credential.GetTokenAsync(tokenContext);

    // 构建请求并添加Bearer令牌
    var request = new HttpRequestMessage(HttpMethod.Get, "https://应用B的API地址/api/values");
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.Token);

    var response = await _httpClient.SendAsync(request);
    response.EnsureSuccessStatusCode();

    var responseContent = await response.Content.ReadAsStringAsync();
    return Ok(responseContent);
}

应用B:验证托管标识请求

前置准备

安装NuGet包:Microsoft.AspNetCore.Authentication.JwtBearer,用于验证Azure AD颁发的JWT令牌。

实现步骤

  1. 配置身份验证:在Program.cs中配置JWT验证,指定Azure AD租户和应用B的受众,同时添加自定义验证逻辑确保请求来自应用A:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://login.microsoftonline.com/你的Azure AD租户ID/v2.0";
        // 应用B的Client ID或应用ID URI
        options.Audience = "应用B的Client ID";

        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                // 获取请求发起方的应用ID(appid声明对应应用的Client ID)
                var requestingAppId = context.Principal.Claims.FirstOrDefault(c => c.Type == "appid")?.Value;
                // 允许的应用A的Client ID
                var allowedAppId = "应用A的Client ID";

                if (requestingAppId != allowedAppId)
                {
                    context.Fail("请求来自未授权的应用");
                }

                return Task.CompletedTask;
            }
        };
    });

builder.Services.AddAuthorization();
  1. 启用授权:在API控制器上添加[Authorize]属性,确保只有携带有效令牌的请求能访问:
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        // 可获取发起请求的应用标识信息
        var appId = User.Claims.FirstOrDefault(c => c.Type == "appid")?.Value;
        return Ok($"请求来自应用:{appId}");
    }
}

额外说明

  • 确保在Azure门户中,应用A已被授予应用B API的应用权限,并完成管理员同意。
  • JWT令牌中的azp声明与appid含义一致,也可用于验证发起方应用ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:36:18