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密钥验证(快速简单)
这是最轻量化的方式,适合小型场景:
- 在API的
appsettings.json中添加密钥配置:{ "ApiKey": "YourRandomSecretKeyHere123!" } - 在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(); - 在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:
- 打开Azure Function的门户页面,进入「设置」→「网络」→「出站IP地址」,复制所有列出的IP地址。
- 打开API的Azure Web App门户页面,进入「设置」→「网络」→「访问限制」,添加规则:
- 规则类型:允许
- 优先级:设为100(高于默认的拒绝规则)
- 地址范围:粘贴Function的每个出站IP(支持CIDR格式批量添加)
- 描述:标记为「Allow Target Azure Function」
- 保存后,只有该Function的IP能访问API,其他请求会被直接拒绝。
方案3:Azure AD身份验证(企业级安全)
适合需要严格身份管控的生产场景,利用Azure AD的令牌验证确保只有指定Function能调用:
- 在Azure AD中注册两个应用程序:一个代表你的API,一个代表Azure Function。
- 给API应用添加自定义范围(比如
access_api),并给Function应用分配该API的权限,完成管理员同意。 - 在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" } } - 在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
相关产品推荐
相关产品推荐

