在Azure Functions中实现基于AAD B2C的JWT身份验证
核心差异说明
Azure Functions的请求管道模型和ASP.NET Core不同,不需要通过app.UseAuthentication()/app.UseAuthorization()注册中间件,而是通过服务配置+[Authorize]属性来实现认证授权逻辑。
步骤1:完善服务配置
在你的ConfigureServices代码中,需要添加AddAuthorization()来注册授权服务,完整配置如下:
.ConfigureServices((host, services) => { services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { host.Configuration.Bind("AzureAdB2C", options); options.TokenValidationParameters.NameClaimType = "name"; }, options => { host.Configuration.Bind("AzureAdB2C", options); } ); // 注册授权服务,支持[Authorize]属性 services.AddAuthorization(); })
步骤2:在函数上启用认证授权
在需要保护的函数方法或类上添加[Authorize]属性,同时注意将HttpTrigger的AuthorizationLevel设置为Anonymous(避免Functions自带的密钥认证覆盖JWT认证):
public class ProtectedFunctions { [FunctionName("GetProtectedData")] [Authorize] // 启用AAD B2C认证,无有效令牌会返回401 public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ILogger log) { // 访问认证后的用户信息 var currentUser = req.HttpContext.User; var userName = currentUser.Identity.Name; var userEmail = currentUser.FindFirst(ClaimTypes.Email)?.Value; return new OkObjectResult($"Authenticated user: {userName}, Email: {userEmail}"); } }
关键注意事项
- HttpTrigger权限设置:必须将
AuthorizationLevel设为Anonymous,否则Functions会优先使用API密钥进行认证,忽略你的JWT令牌。 - 配置一致性:确保
AzureAdB2C的配置项(Instance、Domain、TenantId、ClientId、SignUpSignInPolicyId等)和你之前的Blazor/Web API配置完全一致。 - 自定义授权策略:如果需要基于角色/声明的细粒度授权,可以在
AddAuthorization中配置策略,例如:
然后在函数上使用services.AddAuthorization(options => { options.AddPolicy("AdminOnly", policy => policy.RequireClaim("role", "Admin")); });[Authorize(Policy = "AdminOnly")]。
内容的提问来源于stack exchange,提问作者Giorgio Di Nardo
相关产品推荐
相关产品推荐

