.NET Core 3.1中登出后静态文件仍可访问的问题排查
问题:.NET Core 3.1中登出后仍能访问受保护的静态文件
场景与异常现象
基于.NET Core 3.1构建Web应用,使用.NET Identity保护自动生成的静态文档文件(不允许普通用户查看),同时提供MVC管理页面。预期行为:
- 未登录用户访问静态文件会被重定向至“访问拒绝”页面
- 拥有Admin角色的用户登录后可正常访问静态文件和MVC管理页面
- 用户登出后,MVC管理页面已无法访问,但仍能访问登录期间浏览过的受保护静态文件
相关配置代码(Startup.cs)
using CoreMVC.Data; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using System.IO; namespace CoreMVC { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // 向容器添加服务 public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); // 配置Identity支持角色,关闭邮箱验证要求 services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false) .AddRoles<IdentityRole>() .AddRoleManager<RoleManager<IdentityRole>>() .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddControllersWithViews(); services.AddRazorPages(); // 配置回退授权策略,要求已认证且属于Admin角色 services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .RequireRole("Admin") .Build(); }); } // 配置HTTP请求管道 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); // 开放常规静态文件访问 app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 配置受保护的静态文档目录,挂载到/Documents路径 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(env.ContentRootPath, "Documents")), RequestPath = "/Documents" }); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); } } }
排查过程
- 静态文件通过
Authorization回退策略保护,MVC页面通过[Authorize(Roles = "Admin")]装饰保护 - 确认登出后
.AspNetCore.Identity.ApplicationCookie已被清除 - 手动清除浏览器所有Cookie后,问题依然存在
- 进一步发现仅能访问登录期间浏览过的静态页面,排除服务器缓存问题,最终定位为浏览器本地缓存导致
解决方法
在受保护的静态HTML页面头部添加缓存控制元标签,禁止浏览器缓存该页面:
<meta http-equiv="Cache-Control" content="private, no-store" />
内容的提问来源于stack exchange,提问作者Martin Vaughan
相关产品推荐
相关产品推荐

