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

如何为隔离式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.Web
  • Microsoft.Azure.Functions.Worker.Extensions.Http
  • Microsoft.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:07