.NET 6 Web API新电脑报HTTPS元数据错误的原因及解决办法
.NET 6 Web API迁移新电脑后JWT认证HTTPS元数据错误问题
问题描述
我有一个运行正常的.NET 6 Web API,更换新电脑并安装VS、Postman等工具后,调用API时出现以下错误,但旧电脑上一切正常。请问可能导致该现象的原因是什么?同时如何绕过这类误报:设置RequireHttpsMetadata=false以禁用HTTPS元数据要求。
错误信息
System.InvalidOperationException: 元数据地址(MetadataAddress)或授权服务器地址(Authority)必须使用HTTPS,除非在开发环境中通过设置RequireHttpsMetadata=false禁用此要求。 在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerPostConfigureOptions.PostConfigure(String name, JwtBearerOptions options) 在 Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) 在 Microsoft.Extensions.Options.OptionsMonitor`1.<>c__DisplayClass10_0.<Get>b__0() 在 System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) 在 System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) 在 System.Lazy`1.CreateValue() 在 System.Lazy`1.get_Value() 在 Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) 在 Microsoft.Extensions.Options.OptionsMonitor`1.Get(String name) 在 Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.InitializeAsync(AuthenticationScheme scheme, HttpContext context) 在 Microsoft.AspNetCore.Authentication.AuthenticationHandlerProvider.GetHandlerAsync(HttpContext context, String authenticationScheme) 在 Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme) 在 Microsoft.AspNetCore.Authorization.Policy.PolicyEvaluator.AuthenticateAsync(AuthorizationPolicy policy, HttpContext context) 在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) 在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context) 请求头 ======= Accept: */* Connection: keep-alive Host: localhost:57877 User-Agent: PostmanRuntime/7.29.2 Accept-Encoding: gzip, deflate, br Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjBoWk5vLXZJSkt0WENYeEdWbTk3VmhMcmd0UjFvMzZjZE5ZVk54dk82Z0UifQ.eyJpc3MiOiJodHRwczovL2FjdWl0eWJyYW5kc2RldmxvZ2luLmIyY2xvZ2luLmNvbS84ZTE5OWEwZS05ZGI3LTRiZjUtOWJlNi1kZTUzYzg0N2M1YjUvdjIuMC8iLCJleHAiOjE2Njc2NzEyMzIsIm5iZiI6MTY2NzU4NDgzMiwiYXVkIjoiZDY1YTc5OTMtMDcwMC00MTI0LWI1NGEtMmE2ZWIwNTNhMjI0Iiwic3ViIjoiM2E4ZWYwMjgtZDcyNS00MmZlLTgxMDItYWM4NzhjODQ3MmJjIiwiZ2l2ZW5fbmFtZSI6IlJvYmVydCIsImZhbWlseV9uYW1lIjoiR3JlZW4iLCJzaWduSW5OYW1lIjoiUlhHMThAYWN1aXR5c3NvLmNvbSIsInNjcCI6ImNkbWRhdGEud3JpdGUgY2RtZGF0YS5yZWFkIiwiYXpwIjoiNDE2MjVlMzMtMTk1Ni00ZjM2LTgwNGItYTkxOTI0NDVkZGJhIiwidmVyIjoiMS4wIiwiaWF0IjoxNjY3NTg0ODMyfQ.mJ4rmtIp3IwqS2e56ON27pDPeBbNW9MYNp7fUpqRtVaSrVa2Ija0mwo8f2XNMaC0FUs2rvjs2wRn7vF1FmhI8-hM9RsC8po1tYkg1QtmOWbpF6SpUZZapyE1QXIRvyfW1InLP7abzCCu0_JHLHx8wXlCYUXYrHtIGBa27fe5jo1LIZXnGl0Ok6aYLBPxsdiryQJaI4VLNp0157PVfr1shayrjjkZ3P67XbbKfMzzspjXNe-ZCbo0lDlwm-PsOEdTlNisRiDpzAYrvdr8yG5IlS9uqVWTHLUH0zhBPQNgYr8relFRiGqjqFt9DKpms9B24P4rI47A6aupgyNYxJFo-g Content-Type: application/json Content-Length: 3872 Ocp-Apim-Subscription-Key: d81e91544c174a7c807a7a9f6c5a82d5 Postman-Token: bd3ae0bd-8d5b-44f4-bc49-296140d09300
可能的原因
- 开发环境配置不一致:旧电脑的API配置中已添加
RequireHttpsMetadata=false,或VS自动配置并信任了本地HTTPS证书,新电脑未做这些设置。 - 环境变量识别差异:新电脑的
ASPNETCORE_ENVIRONMENT环境变量未设置为Development,导致API启用生产环境的HTTPS元数据强制要求。 - JWT认证地址协议问题:若JWT授权服务器地址使用HTTP而非HTTPS,非开发环境下ASP.NET Core会强制要求HTTPS元数据,触发错误。
- 本地HTTPS证书未信任:新电脑未安装或信任VS生成的本地HTTPS开发证书,导致API只能通过HTTP启动,进而JWT元数据请求用HTTP触发检查。
解决方法
1. 禁用开发环境的HTTPS元数据要求
在.NET 6的Program.cs中配置JWT认证时添加以下设置:
using Microsoft.AspNetCore.Authentication.JwtBearer; var builder = WebApplication.CreateBuilder(args); // 添加JWT认证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "你的授权服务器地址"; // 替换为实际地址 options.Audience = "你的API受众标识"; // 替换为实际受众 // 仅开发环境禁用HTTPS元数据要求 options.RequireHttpsMetadata = builder.Environment.IsDevelopment(); }); // 其他配置... var app = builder.Build(); // 启用认证中间件 app.UseAuthentication(); app.UseAuthorization(); // 其他中间件配置... app.Run();
若使用传统Startup.cs模式:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Hosting; public class Startup { public IWebHostEnvironment Env { get; } public Startup(IWebHostEnvironment env) { Env = env; } public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "你的授权服务器地址"; options.Audience = "你的API受众标识"; options.RequireHttpsMetadata = Env.IsDevelopment(); }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他配置... app.UseAuthentication(); app.UseAuthorization(); // 其他配置... } }
2. 安装并信任本地HTTPS开发证书
打开命令提示符,运行以下命令生成并信任证书:
dotnet dev-certs https --trust
执行后重启VS和API,确保API通过HTTPS启动。
3. 确认环境变量设置
- Windows:命令提示符运行
echo %ASPNETCORE_ENVIRONMENT%,若不是Development,执行setx ASPNETCORE_ENVIRONMENT Development设置。 - macOS/Linux:终端运行
echo $ASPNETCORE_ENVIRONMENT,若不是Development,执行export ASPNETCORE_ENVIRONMENT=Development(临时生效)或修改shell配置文件永久设置。
内容的提问来源于stack exchange,提问作者Robert Green MBA
相关产品推荐
相关产品推荐

