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
相关产品推荐
相关产品推荐

