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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:45:36