如何为隔离式Azure Function配置Microsoft.Identity代码认证?
配置隔离式Azure Function使用Microsoft.Identity进行身份验证
核心逻辑
隔离式Azure Function基于ASP.NET Core托管模型,完全可以复用ASP.NET Core的认证中间件体系,无需依赖App Service内置认证功能,实现和Web API一致的services.AddAuthentication(...)式配置。
具体实现步骤
1. 安装必要NuGet包
需要引入以下包:
Microsoft.Identity.WebMicrosoft.Azure.Functions.Worker.Extensions.HttpMicrosoft.Identity.Web.UI(可选,用于处理交互式认证回调)
通过命令行安装示例:
Install-Package Microsoft.Identity.Web Install-Package Microsoft.Azure.Functions.Worker.Extensions.Http
2. 在Program.cs中配置认证服务
在宿主构建流程里添加认证与授权配置,和Web API的配置逻辑对齐:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Identity.Web; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(builder => { // 注入认证、授权中间件到请求管道 builder.AddAuthenticationMiddleware(); builder.AddAuthorizationMiddleware(); }) .ConfigureServices(services => { // 配置Microsoft.Identity认证 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { options.TokenValidationParameters.NameClaimType = "name"; }, options => { options.Instance = "https://login.microsoftonline.com/"; options.Domain = "<你的租户域名>"; options.TenantId = "<你的租户ID>"; options.ClientId = "<你的客户端ID>"; options.AppIdUri = "api://<你的客户端ID>"; }); // 启用授权服务 services.AddAuthorization(); }) .Build(); host.Run();
3. 用配置文件管理Azure AD参数
将敏感配置写入appsettings.json避免硬编码:
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "your-tenant-domain.onmicrosoft.com", "TenantId": "your-tenant-id", "ClientId": "your-client-id", "AppIdUri": "api://your-client-id" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
修改Program.cs中的配置绑定逻辑:
// 引入Configuration using Microsoft.Extensions.Configuration; // ... .ConfigureServices((context, services) => { services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(context.Configuration.GetSection("AzureAd")); services.AddAuthorization(); })
4. 在函数中启用授权验证
在HTTP触发器函数上添加[Authorize]属性,确保只有通过认证的请求可访问:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; namespace IsolatedFunctionAuthDemo { public class ProtectedFunction { [Function("ProtectedEndpoint")] [Authorize] public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req) { // 获取当前认证用户信息 var user = req.HttpContext.User; return new OkObjectResult($"已认证用户:{user.Identity.Name}"); } } }
注意:HTTP触发器的AuthorizationLevel要设为Anonymous,因为认证逻辑由自定义中间件处理,而非App Service内置认证。
5. 进阶:角色/范围验证
如果需要验证用户角色或API权限范围,可定义授权策略并绑定到[Authorize]属性:
// Program.cs中添加策略配置 services.AddAuthorization(options => { options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin")); options.AddPolicy("ReadScope", policy => policy.RequireClaim("scp", "api://your-client-id/access_as_user")); }); // 函数中使用策略 [Function("AdminOnlyEndpoint")] [Authorize(Policy = "RequireAdminRole")] public IActionResult AdminOnlyRun([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req) { return new OkObjectResult("仅管理员可访问"); }
关键注意事项
- 确保Azure AD应用已正确配置:添加API权限、设置正确的
App ID URI,若使用客户端凭证需配置客户端密钥。 - 本地调试时,可通过Postman等工具携带Azure AD颁发的JWT令牌调用函数端点,验证认证逻辑。
内容的提问来源于stack exchange,提问作者MiddleTommy
相关产品推荐
相关产品推荐

