使用Azure托管标识实现REST API通信授权的POC开发问询
使用Azure托管标识实现.NET Core应用间的身份验证
应用A:携带托管标识发起HTTP请求
前置准备
先安装必要的NuGet包:
Azure.Identity:用于获取托管标识的访问令牌System.Net.Http:.NET Core自带,用于发起HTTP请求
实现步骤
- 注入依赖:在
Program.cs中注册HttpClient和DefaultAzureCredential(自动适配托管标识环境):
builder.Services.AddHttpClient(); builder.Services.AddSingleton<DefaultAzureCredential>();
如果使用用户分配的托管标识,需要指定标识的Client ID:
builder.Services.AddSingleton(new DefaultAzureCredential( new DefaultAzureCredentialOptions { ManagedIdentityClientId = "你的用户分配标识Client ID" }));
- 获取令牌并发起请求:在控制器或服务中,获取目标应用(应用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令牌。
实现步骤
- 配置身份验证:在
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();
- 启用授权:在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
相关产品推荐
相关产品推荐

