ASP.NET Core 9中MapStaticAssets无法加载wwwroot公开静态资源问题
问题
在.NET 9中使用MapStaticAssets替代UseStaticFiles,根据官方文档,在UseAuthorization之前调用该方法时,wwwroot下的静态资源应无需授权即可公开访问。但实际项目中,当将Authorization的FallbackPolicy设置为DefaultPolicy后,出现登出页面渲染异常、直接访问静态资源(如localhost:7119/css/site.css)会被强制要求认证的问题。
相关授权配置代码:
builder.Services.AddAuthorization(options => { // By default, all incoming requests will be authorized according to the default policy. options.FallbackPolicy = options.DefaultPolicy; });
完整项目代码示例:
var builder = WebApplication.CreateBuilder(args); var settings = builder.Configuration.GetSection("AzureAd"); var initialScopes = builder.Configuration["MicrosoftGraph:Scopes"]?.Split(' '); builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(settings) .EnableTokenAcquisitionToCallDownstreamApi(initialScopes) .AddInMemoryTokenCaches(); builder.Services.AddAuthorization(options => { // By default, all incoming requests will be authorized according to the default policy. options.FallbackPolicy = options.DefaultPolicy; }); builder.Services.AddRazorPages() .AddMicrosoftIdentityUI(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.MapStaticAssets(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages() .WithStaticAssets(); app.MapControllers(); app.Run();
原因与解决方案
这是配置问题,并非Bug。
当设置options.FallbackPolicy = options.DefaultPolicy后,所有未明确指定授权策略的请求都会默认应用DefaultPolicy(即要求用户已认证)。MapStaticAssets仅负责映射静态资源路由,但该路由仍会受到全局FallbackPolicy的约束,不会自动豁免认证要求。
解决方法是为静态资源路由显式添加匿名访问允许:
app.MapStaticAssets().AllowAnonymous();
修改后的请求管道配置片段:
app.UseHttpsRedirection(); // 为静态资源添加匿名访问豁免 app.MapStaticAssets().AllowAnonymous(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages() .WithStaticAssets(); app.MapControllers();
此配置生效后,wwwroot下的静态资源将绕过认证要求,可正常公开访问,登出页面的静态资源也能正常加载。
内容的提问来源于stack exchange,提问作者OjM
相关产品推荐
相关产品推荐

