使用App Role实现Azure App Service API调用授权求助
使用Azure App Role实现.NET Core App Service API的应用间授权
一、配置提供者侧的.NET Core API
1. App Service身份验证设置
在Azure门户的提供者App Service中,进入「身份验证」面板:
- 启用「App Service 身份验证」
- 选择「Azure Active Directory」作为身份提供者,切换到「高级」模式
- 填写以下信息:
- 客户端ID:提供者应用注册的客户端ID
- 颁发机构URL:
https://login.microsoftonline.com/你的租户ID/v2.0 - 受众:
api://{提供者应用注册的客户端ID}(必须和应用注册里的「应用ID URI」一致)
2. 项目代码配置
在.NET Core API项目中,添加Microsoft.Identity.Web NuGet包,然后修改Program.cs:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Identity.Web; var builder = WebApplication.CreateBuilder(args); // 添加身份验证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 添加授权策略,指定需要的应用角色 builder.Services.AddAuthorization(options => { options.AddPolicy("RequireSpecificAppRole", policy => policy.RequireRole("你的应用角色名称")); // 替换为你在提供者应用注册中定义的角色名 }); builder.Services.AddControllers(); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
在appsettings.json中添加Azure AD配置节点:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的租户ID", "ClientId": "提供者应用注册的客户端ID", "Audience": "api://{提供者应用注册的客户端ID}" }
3. 给API接口添加授权
在需要保护的控制器或方法上添加[Authorize]特性,指定刚才定义的策略:
[Authorize(Policy = "RequireSpecificAppRole")] [ApiController] [Route("api/[controller]")] public class DemoController : ControllerBase { [HttpGet] public IActionResult Get() { return Ok("授权成功"); } }
二、消费者应用获取访问令牌
消费者应用使用客户端凭据流获取令牌,需添加Microsoft.Identity.Client NuGet包,示例代码:
using Microsoft.Identity.Client; var tenantId = "你的租户ID"; var clientId = "消费者应用注册的客户端ID"; var clientSecret = "消费者应用注册的客户端密钥"; var apiScope = "api://{提供者应用注册的客户端ID}/.default"; // 固定格式,.default表示使用已授予的所有应用权限 var app = ConfidentialClientApplicationBuilder.Create(clientId) .WithClientSecret(clientSecret) .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}")) .Build(); var result = await app.AcquireTokenForClient(new[] { apiScope }) .ExecuteAsync(); string accessToken = result.AccessToken;
三、消费者调用受保护的API
使用HttpClient携带Bearer令牌调用API:
using System.Net.Http.Headers; var apiUrl = "https://你的提供者App Service域名/api/demo"; using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var response = await client.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); // 若授权失败会抛出异常 var responseContent = await response.Content.ReadAsStringAsync();
关键注意事项
- 确保在Azure门户的消费者应用注册中,已将提供者的应用角色添加为API权限,并且点击了授予管理员同意(应用级权限必须管理员同意才能生效)
- 提供者应用注册中定义的应用角色,其「允许的成员类型」必须设置为「应用程序」,否则无法被消费者应用获取
内容的提问来源于stack exchange,提问作者Som
相关产品推荐
相关产品推荐

