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

ASP.NET Core 8 Web API主机过滤失效问题求助

问题分析与解决方案

你遇到的400 Bad Request本质是对ASP.NET Core AllowedHosts配置的作用理解错误,再加上用错了限制请求来源的方式。下面直接说问题根因和可行的解决办法:

为什么设置AllowedHosts会导致400?

AllowedHosts的作用是验证请求的HTTP Host头是否合法,而不是限制请求的来源IP/域名。当你的Azure Function调用API时,请求的Host头是API自己的Azure Web App域名(比如yourapi.azurewebsites.net),但你把AllowedHosts设成了Function的域名,导致Host头验证失败,直接返回400。

先把这个配置改回API自身的域名(或者临时设为*),就能解决400问题:

// appsettings.json
{
  "AllowedHosts": "testhostingrestrctionsapi.azurewebsites.net"
}

正确限制仅指定Azure Function调用API的方法

要实现只允许特定Function访问API,有三种实用方案,按复杂度和安全性排序:

方案1:API密钥验证(快速简单)

这是最轻量化的方式,适合小型场景:

  1. 在API的appsettings.json中添加密钥配置:
    {
      "ApiKey": "YourRandomSecretKeyHere123!"
    }
    
  2. 在API的Program.cs中添加验证逻辑:
    var builder = WebApplication.CreateBuilder(args);
    var apiKey = builder.Configuration["ApiKey"];
    
    // 添加API密钥验证策略
    builder.Services.AddAuthorization(options =>
    {
        options.AddPolicy("ApiKeyPolicy", policy =>
        {
            policy.RequireAssertion(context =>
            {
                context.Request.Headers.TryGetValue("X-Api-Key", out var requestApiKey);
                return string.Equals(requestApiKey, apiKey, StringComparison.OrdinalIgnoreCase);
            });
        });
    });
    
    builder.Services.AddControllers();
    
    var app = builder.Build();
    app.UseAuthorization();
    // 给所有接口添加密钥验证
    app.MapControllers().RequireAuthorization("ApiKeyPolicy");
    
    app.Run();
    
  3. 在Azure Function中调用API时,添加请求头携带密钥:
    var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Add("X-Api-Key", "YourRandomSecretKeyHere123!");
    var response = await httpClient.GetAsync("https://testhostingrestrctionsapi.azurewebsites.net/WeatherForecast");
    

方案2:Azure Web App IP访问限制(基于Function出站IP)

通过IP白名单限制只有Function的出站IP能访问API:

  1. 打开Azure Function的门户页面,进入「设置」→「网络」→「出站IP地址」,复制所有列出的IP地址。
  2. 打开API的Azure Web App门户页面,进入「设置」→「网络」→「访问限制」,添加规则:
    • 规则类型:允许
    • 优先级:设为100(高于默认的拒绝规则)
    • 地址范围:粘贴Function的每个出站IP(支持CIDR格式批量添加)
    • 描述:标记为「Allow Target Azure Function」
  3. 保存后,只有该Function的IP能访问API,其他请求会被直接拒绝。

方案3:Azure AD身份验证(企业级安全)

适合需要严格身份管控的生产场景,利用Azure AD的令牌验证确保只有指定Function能调用:

  1. 在Azure AD中注册两个应用程序:一个代表你的API,一个代表Azure Function。
  2. 给API应用添加自定义范围(比如access_api),并给Function应用分配该API的权限,完成管理员同意。
  3. 在API的Program.cs中配置Azure AD验证:
    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
    
    builder.Services.AddAuthorization();
    
    同时在appsettings.json中添加Azure AD配置:
    {
      "AzureAd": {
        "Instance": "https://login.microsoftonline.com/",
        "TenantId": "你的租户ID",
        "ClientId": "API应用的ClientID"
      }
    }
    
  4. 在Azure Function中获取访问令牌并调用API:
    var credential = new DefaultAzureCredential();
    var token = await credential.GetTokenAsync(
        new TokenRequestContext(new[] { "api://API应用ClientID/access_api" })
    );
    
    var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
    var response = await httpClient.GetAsync("https://testhostingrestrctionsapi.azurewebsites.net/WeatherForecast");
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:03:22