如何通过Azure托管标识限制.NET Core Web API的访问权限?
解决方法:限制仅指定用户分配托管标识访问Azure API App
一、先关闭API App的匿名访问(Azure门户配置)
当前API App允许匿名请求是导致未分配托管标识的Web App仍能访问的核心原因,需先拦截未授权请求:
- 进入Azure门户的API App资源,打开身份验证选项卡
- 启用「App Service 身份验证」,在「未经过身份验证的请求」下拉框中选择拒绝(401未经授权),无合法身份的请求会直接被拦截
二、配置API App的权限规则,锁定目标托管标识
你之前给托管标识分配的「参与者(Contributor)」是资源管理权限,和API访问权限无关,需重新配置:
- 确保API App已关联Azure AD应用(启用App Service身份验证后会自动创建)
- 在Azure AD中找到你的用户分配托管标识,为其分配API App的访问权限(可在API App的Azure AD应用「权限」页或托管标识的「权限」页操作)
三、在API App代码中添加身份验证中间件,精准校验标识
仅靠门户设置不够,需在.NET Core Web API中添加授权逻辑,确保只有指定托管标识能访问:
- 项目引用
Microsoft.Identity.WebNuGet包 - 在
Program.cs中配置Azure AD身份验证:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
- 定义专属授权策略,指定允许的托管标识(替换为你的托管标识客户端ID):
builder.Services.AddAuthorization(options => { options.AddPolicy("OnlyAllowedManagedIdentity", policy => { policy.RequireClaim("azp", "<你的用户分配托管标识客户端ID>"); }); });
- 在控制器或路由上应用该策略:
[Authorize(Policy = "OnlyAllowedManagedIdentity")] [ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { // 你的API接口逻辑 }
四、Web App侧配置使用托管标识调用API
现在给Web App分配目标托管标识,并修改代码以标识身份请求API:
- 在Web App的身份标识设置中,启用用户分配的托管标识,添加你创建的那个标识
- 修改Web App的HttpClient调用逻辑,用托管标识获取令牌:
var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = "<你的托管标识客户端ID>" }); var token = await credential.GetTokenAsync(new TokenRequestContext(new[] { "<API App的Azure AD应用范围>" })); var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Token); var response = await client.GetAsync("<API App端点URL>");
内容的提问来源于stack exchange,提问作者Jaish Mathews
相关产品推荐
相关产品推荐

