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

Azure App Service单个端点配置托管身份访问可行性咨询

方案完全可行,以下是具体实现步骤

你的需求完全可以满足,不用大改现有ASP.NET应用的认证体系,只需要叠加Entra ID托管身份认证逻辑,针对/api/Foo单独配置授权规则即可,具体操作如下:

1. 在ASP.NET应用中新增Entra ID认证方案

在Program.cs(或Startup.cs)中,保留原有用户名密码/JWT认证的同时,添加针对Entra ID的JWT Bearer认证:

builder.Services.AddAuthentication()
    // 保留原有用户认证方案(比如你当前用的JWT或Cookie认证)
    .AddJwtBearer("UserJwt", options => {
        // 原有用户JWT的配置逻辑,比如密钥、issuer等
    })
    // 新增针对托管身份的Entra ID认证方案
    .AddJwtBearer("ManagedIdentity", options => {
        options.Authority = "https://login.microsoftonline.com/{你的TenantId}/v2.0";
        options.Audience = "{你的ASP.NET应用在Entra ID中的ClientId}";
        // 验证token的发行者和受众,确保是可信的托管身份
        options.TokenValidationParameters = new TokenValidationParameters {
            ValidateIssuer = true,
            ValidIssuer = "https://login.microsoftonline.com/{你的TenantId}/v2.0",
            ValidateAudience = true,
            ValidAudience = "{你的ASP.NET应用在Entra ID中的ClientId}"
        };
    });

2. 定义专属授权策略,限制仅托管身份访问

创建一个授权策略,要求请求必须通过ManagedIdentity认证方案:

builder.Services.AddAuthorization(options => {
    options.AddPolicy("ManagedIdentityOnly", policy =>
        policy.AuthenticationSchemes.Add("ManagedIdentity")
            .RequireAuthenticatedUser());
});

3. 给/api/Foo端点绑定专属策略

在你的/api/Foo控制器方法上,添加授权特性,指定使用上面的策略,同时不影响其他端点的原有认证:

[ApiController]
[Route("api/[controller]")]
public class FooController : ControllerBase
{
    // 仅允许托管身份访问
    [Authorize(Policy = "ManagedIdentityOnly")]
    [HttpGet]
    public IActionResult Get()
    {
        // 你的计算逻辑
        return Ok("计算结果");
    }
}

// 其他端点保持原有授权配置,比如:
[Authorize(AuthenticationSchemes = "UserJwt")]
[ApiController]
[Route("api/[controller]")]
public class BarController : ControllerBase
{
    // ...原有逻辑
}

4. 配置FunctionApp的托管身份与访问权限

  • 给你的FunctionApp启用系统分配或用户分配的托管身份
  • 在Entra ID中,找到你的ASP.NET应用注册,给该托管身份添加应用权限(确保权限范围足够访问/api/Foo)
  • 也可以在ASP.NET应用中,通过代码验证token中的appid是否为FunctionApp托管身份的ClientId,进一步缩小访问范围

5. FunctionApp中调用/api/Foo的示例

FunctionApp里用托管身份获取访问令牌,然后调用端点:

var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
    new TokenRequestContext(new[] { "https://{你的ASP.NET应用域名}/.default" })
);

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Token);
var response = await client.GetAsync("https://{你的ASP.NET应用域名}/api/Foo");

这样配置后,原有端点的认证逻辑完全不受影响,/api/Foo仅允许持有有效Entra ID托管身份令牌的请求访问,完美解决了代码和数据库连接重复的可维护性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:03:22